我认为我对类数据成员及其内存表示有清晰的理解:
类的成员定义对象的布局:数据成员在内存中一个接一个地存储。使用继承时,派生类的数据成员只会添加到基类的数据成员中。
然而,当我试图找出一个对象的"蓝图" 如何被其功能成员修改时带有其他语法元素:我遇到了困难。在下文中,我试图列出所有有问题的 1 函数成员语法,这使我很难弄清楚对象内存的大小和结构。
我无法弄清楚的类成员函数:
lambda
,指向函数的指针,修改,非修改。friend
(非成员),virtual
,final
,override
,static
,const
, volatile
,mutable
。在对象内存布局的上下文中,不同说明符的成员函数之间有什么区别?它们如何影响它?
我已经阅读了this和this,但没有提供令人满意的答案 2 。 This谈到一般情况(我理解),这是最接近重复的。(但我特别关注有问题的语法列表,这是我的实际问题,并没有在那里讨论。)
1。在影响对象内存布局方面。
2。第一个是讨论 GCC编译器,第二个是提供一个关于@m @ zon的书的链接。
答案 0 :(得分:2)
成员函数不是对象内存布局的一部分。可归因于成员函数的唯一事物是对用于执行动态分派的实现定义结构的隐藏引用,例如virtual method table。仅当对象具有至少一个虚拟成员函数时,才会将此引用添加到对象中,因此没有虚函数的类的对象可以免除此开销。
回到你的具体问题,成员函数唯一对对象的内存布局有影响的修饰符是virtual
* 。其他修饰符会影响函数本身的解释方式,但它们不会更改对象的内存布局。
* override
关键字还表示基类中存在虚拟成员函数,但它是可选的;添加或删除它不会改变对象的内存布局。