面经
KylerLiZi
这个作者很懒,什么都没留下…
展开
-
【C++】运行时类型识别RTTI与反射详解
RTTIRTTI(Run-Time Type Information)运行时类型识别的英文缩写,它提供了运行时确定对象类型的方法。面向对象的编程语言,像C++,Java,delphi都提供了对RTTI的支持。 本文将描述 RTTI 的概念、简略介绍 RTTI 的一些背景知识、并通过具体例子和代码介绍什么时候使用以及如何使用 RTTI的两个重要运算符 typeid 和 dynamic_cast的使用方法。背景知识其实,RTTI 在C++中并不是什么新的东西,它早在十多年以前就已经出现了。但是大多数原创 2020-07-11 15:04:29 · 1914 阅读 · 0 评论 -
【C++】结构体/联合中的数据成员对齐规则
对齐规则1、每个数据成员在内存中的存储起始位置必须是自身大小的整数倍,如32位下的int占4个字节,则存储地址必须是4的整数倍。struct node{ char a;//起始0是1的倍数,a存放在0 int b;//起始1不是4的倍数,起始调整为4,b存放在4};sizeof(node) = 82、若结构体node里有其他的结构体成员node2,则结构体成员node2要从其内部最大元素大小的整数倍地址开始存储。struct node//共占16字节{ ...原创 2020-05-21 18:13:07 · 372 阅读 · 0 评论 -
【C++】编译过程
C++编译过程可分为四个阶段预处理阶段:对源代码文件中文件包含关系(头文件)、预编译语句(宏定义)进行分析和替换,生成预编译文件。编译阶段:将经过预处理后的预编译文件转换成特定汇编代码,生成汇编文件。汇编阶段:将编译阶段生成的汇编文件转化成机器码,生成可重定位目标文件。链接阶段:将多个目标文件及所需要的库连接成最终的可执行目标文件。...原创 2020-05-21 16:05:05 · 191 阅读 · 0 评论 -
【C++】构造函数、析构函数可以是虚函数么?
构造函数不能是虚函数1、创建一个对象必须明确指出它的类型,否则无法创建,一个对象创建成功,编译器获得它的实际类型,然后去调用对应的函数,而如果构造函数声明为虚函数,会形成一个死锁,虚函数是在运行才能确定确定其调用哪一个类型的函数,而具体哪一个类型是编译器通过对象的类型去确定的,但是此时对象还未创建也就没法知道其真实类型。2、虚函数对应一张虚函数表,这个虚函数表是存储在对象的内存空间的,如果构造函数是虚函数就需要通过虚函数表来调用,可是对象还没有实例化,也就是内存空间还没有,找不到虚函数表,所以构造函原创 2020-05-21 16:01:13 · 870 阅读 · 1 评论 -
【C++】虚函数、纯虚函数、多态与虚表机制详解
虚函数在类的定义中,前面有 virtual 关键字的成员函数就是虚函数。注:派生类中的成员函数 与 基类中虚函数同名且同参数的函数,不加virtual也自动成为虚函数。多态多态的实现是通过虚函数。多态的作用是增强程序的可扩充性,即程序需要修改或增加功能的时候,需要改动和增加的代码较少。多态的关键在于通过基类指针或引用调用一个虚函数时,编译阶段不能确定到底调用的是基类还是派生类的函数,运行时才能够确定——这叫动态联编。虚函数因为用了虚函数表机制,调用的时候会增加内存开销,具体见下文。原创 2020-05-21 15:16:45 · 1341 阅读 · 0 评论 -
【C++】运算符重载
定义运算符重载,就是对已有的运算符(C++中预定义的运算符)赋予多重的含义,使同一运算符作用于不同类型的数据时导致不同类型的行为。对运算符进行重载的时候,好的风格是应该尽量保留运算符原本的类型。目的扩展C++中提供的运算符的适用范围,使之能作用于对象。实质函数重载。可以重载为普通函数,也可以重载为成员函数。形式返回值类型 operator 运算符(形参表){ ……}加减运算符重载示例Complex_a和Complex_b是两个复数对象;求两个复数的和,原创 2020-05-18 17:02:36 · 317 阅读 · 0 评论 -
【C++ 算法】快排优化之基准选择与方法
三数取中(选基准)+插排(优化)+三向切分聚集重复值(优化)的时间复杂度同STL中的Sort近似。一、基准的选择最理想的方法是,选择的基准恰好能把待排序序列分成两个等长的子序列。1、随机选取基准:在待排序列是部分有序时,固定选取枢轴使快排效率底下,要缓解这种情况,就引入了随机选取枢轴。思想:取待排序列中任意一个元素作为基准。2、三数取中:使用左端、右端和中心位置上的三个元素比较,大小为中值的作为枢纽元。注:使用三数取中选择枢轴优势还是很明显的,但是还是处理不了重复数组二、优化的方原创 2020-05-18 17:51:49 · 753 阅读 · 0 评论 -
【C++】Static的用法分类详解
1 全局静态变量在全局变量前加上关键字static,全局变量就定义成一个全局静态变量内存中的位置:静态存储区,在整个程序运行期间一直存在初始化:未经初始化的全局静态变量会被自动初始化为0(自动对象的值是任意的,除非他被显式初始化)作用域:全局静态变量在声明他的文件之外是不可见的,准确地说是从定义之处开始,到文件结尾2局部静态变量在局部变量之前加上关键字static,局部变量就成为一个局部静态变量内存中的位置:静态存储区初始化:未经初始化的全局静态变量会被自动初始化为0(自动.原创 2020-05-18 17:25:45 · 204 阅读 · 0 评论 -
【C++】i++=5编译报错,i++不能作为左值的原因
左值与右值首先,我们需要明确左值与右值的定义。一个简单的理解就是,对于每个变量,均是可寻址的,均与两个值有关:它的数据值——存储在某个内存空间中,不占有确定位置的表达式,被称为右值(rvalue)。 它的地址值——存储数据值的内存的地址,占有确定的位置,被称为左值(lvalue)。i++不能作为左值的原因int i = 0; i++=5;编译报错!由于i++的内部实现是创建...原创 2020-04-21 15:25:57 · 1073 阅读 · 0 评论 -
【Houdini】Vertex与Point的区别
我将在Houdini中创建一个Grid,使用Divide细分,用这两个三角形拼接成的正方形,以可视化的方式通俗易懂地让你理解他们的区别。可以看到在正方形的四个角上,显示有两种颜色的数字。位于外围的紫色的点(被标记为0、1、2、3)被称为Point,能够独立存在,不依附于Primitive,可被多个面共享,不唯一。 位于每一个Primitive(三角形)内角的点(被标记为0、1、2)被...原创 2020-04-10 15:58:12 · 3315 阅读 · 1 评论 -
【C++】map与unordered_map的区别与使用
转自:https://blog.csdn.net/BillCYJ/article/details/78985895需要引入的头文件不同map: #include < map >unordered_map: #include < unordered_map >内部实现机理不同m...转载 2020-02-21 19:37:56 · 292 阅读 · 0 评论 -
【C++】构造函数和析构函数能否为虚函数
简单回答是:构造函数不能为虚函数,而析构函数可以且常常是虚函数。(1) 构造函数不能为虚函数让我们来看看大牛C++之父 Bjarne Stroustrup 在《The C++ Programming Language》里是怎么说的:To construct an object, a constructor needs the exact type of the object it i...转载 2020-04-20 10:55:11 · 384 阅读 · 0 评论 -
【C++】++i与i++哪个性能更优
对于基本类型比如int等,两者性能没有区别。 对于符合对象比如类、结构体等,++i的性能优于i++。原因是i++会产生临时对象,生成一个拷贝,若拷贝对象的内容较多,则会增加很多开销。举个栗子:i++的运算过程如下:int temp = i ; i = i + 1 ; return temp ;++i的运算过程如下:return i+1;...原创 2020-04-20 11:07:09 · 905 阅读 · 0 评论