根据前面讲过的知识,C++ 的对象内存模型主要包含了以下几个方面的内容:
- 如果没有虚函数也没有虚继承,那么对象内存模型中只有成员变量。
- 如果类包含了虚函数,那么会额外添加一个虚函数表,并在对象内存中插入一个指针,指向这个虚函数表。
- 如果类包含了虚继承,那么会额外添加一个虚基类表,并在对象内存中插入一个指针,指向这个虚基类表。
为什么虚函数就能实现多态?
因为在没有虚函数的时候,指针指向一个对象,会调用基类或者派生类的哪一个函数,是看这个指针的类型所决定的
而当这个类或者父类中有定义虚函数的时候,内存模型里就会多一个虚表指针vptr,这时候调用函数就不会根据指针类型,而是根据指针指向的对象,从对象的虚表指针找到虚表,从根据函数名找到在虚函数表里的位置,推算得到入口地址,从而执行该入口的函数。
成员变量就有内存的要求,所谓内存对齐,就是在分配内存时,数据会按照一些对齐规则在内存中进行对齐的存储,提高数据读取效率。
原则1:每一个成员变量都有一个对齐数,这个对齐数由该数据结构的字节占用和当前编译默认对齐数取较小值。表明这个成员变量需要从内存为对齐数的整数倍位置开始存储这样读取的效率比较高。(默认对齐数可以通过prama pack(n)修改)
原则2:原则1说明了下标起始位置,但没有指明补齐。补齐是指该成员变量后面还有其他变量的话,那后面的变量下标也有下标起始位置的对齐要求,从当前存储下标的末尾到下一个变量对齐的起始位置之间的内存会被填充补齐。
原则3:结构的总占用空间大小是所有成员变量对齐数中最大的一个的整数倍。
标签:函数,对象,模型,C++,内存,对齐,变量,指针 From: https://www.cnblogs.com/synapse331/p/17662830.html