⼋
股
⽂
C++
篇
(
超
级
全
)
_c++
⼋
股
⽂
-CSDN
博
客
https://blog.csdn.net/m0_50816320/article/details/129326768?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.no
…
什么const在常量区,什么const在栈区,什么const放入符号表优化
如果const修饰的是全局变量放到常量区
如果const修饰的是局部变量放在栈区
如果const修饰的变量没有被使用则会放到符号表中,其内容不会分配空间
经过内存对⻬之后,CPU 的内存访问速度⼤⼤提升。因为 CPU 把内存当成是⼀块⼀块的,块的⼤⼩可以是 2,4,8,16 个字节,因此 CPU 在读取内存的时候是⼀
块⼀块进⾏读取的,块的大小称为内存读取粒度。⽐如说 CPU 要读取⼀个 4 个字节的数据到寄存器中(假设内存读取粒度是 4),如果数据是从 0 字节开始的,那
么直接将 0-3 四个字节完全读取到寄存器中进⾏处理即可。
如果数据是从 1 字节开始的,就⾸先要将前 4 个字节读取到寄存器,并再次读取 4-7 个字节数据进⼊寄存器,接着把 0 字节,5,6,7 字节的数据剔除,最后合并
1,2,3,4字节的数据进⼊寄存器,所以说,当内存没有对⻬时,寄存器进⾏了很多额外的操作,⼤⼤降低了 CPU 的性能。
平台原因:不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
性能原因:应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次就可以了。
什么时候不希望进行内存对齐呢?一般来说,当我们追求空间效率而不是时间效率时,我们可以选择取消或者减小内存对齐。例如,在 嵌入式系统 中,由于资源有限,
我们可能更关心节省空间而不是提高速度。此时我们可以使用编译器提供的选项来调整或者关闭内存对齐。
对于结构体的各个成员,第一个成员位于偏移为0的位置,结构体第一个成员的偏移量(offset)为0,以后每个成员相对于结构体首地址的offset都是该成员大小与有效对
齐值中较小那个的整数倍,如有需要编译器会在成员之间加上填充字节。
有效对齐值是给定值#pragma pack (n)和结构体中最长数据类型长度中较小的那个,其中n是编译器提供的选项,可以是1,2,4,8,16等
除了结构成员需要对齐,结构本身也需要对齐,结构的长度必须是编译器默认的对齐长度和成员中最长类型中最小的数据大小的倍数对齐。
父类型的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。
每个虚函数都会有一个与之对应的虚函数表,该虚函数表的实质是一个指针数组,存放的是每一个对象的虚函数入口地址。对于一个派生类来说,他会继承基类的虚函数表
同时增加自己的虚函数入口地址,如果派生类重写了基类的虚函数的话,那么继承过来的虚函数入口地址将被派生类的重写虚函数入口地址替代。那么在程序运行时会发生
动态绑定,将父类指针绑定到实例化的对象实现多态。每个类只有一个虚函数表,虚函数表是在编译的时候就确定的了。
虚函数在运行时根据实际对象的类型来确定调用哪个函数,而不是根据指针或引用的类型来确定。当一个虚函数被定义为类的成员函数时,它会被标记为虚函数。在调用虚
函数时,程序会查找该函数的实际类型,并在运行时调用该类型的实现。这就允许程序在运行时动态地选择执行哪个版本的虚函数,从而实现多态性。虚函数通常与基类指
针或引用一起使用,可以实现基类指针或引用调用派生类的函数。
虚函数表是一个存储虚函数指针的数组,每个类有一个虚函数表,每个对象有一个指向虚函数表的指针。虚函数表的大小取决于类中有多少个虚函数,而对象中的虚函数表
指针的大小取决于编译器和操作系统2。一般来说,在32位系统下,指针占4个字节,在64位系统下,指针占8个字节。
构造函数:构造函数不能被声明为虚函数。因为构造函数是用来创建对象的,而虚函数是根据对象的类型来动态调用的。如果构造函数是虚函数,那么在创建对象时就无法
确定调用哪个版本的构造函数,会导致逻辑错误
友元函数:你说得对,构造函数不能被声明为虚函数。因为构造函数是用来创建对象的,而虚函数是根据对象的类型来动态调用的。如果构造函数是虚函数,那么在创建对