1

我想我对类数据成员及其在内存中的表示有一个清晰的了解:

类的成员定义了对象的布局:数据成员一个接一个地存储在内存中。使用继承时,派生类的数据成员只是添加到基类的数据成员中。

然而,当我试图弄清楚一个对象的“蓝图”是如何被它的函数成员用额外的语法元素修改的时:我遇到了困难。在下面的文本中,我试图列出所有有问题的1函数成员语法,这些语法使我难以弄清楚对象内存大小和结构。

我无法弄清楚的类成员函数:

  • 函数类型:lambda, 函数指针,修改,非修改
  • 包含额外的语法元素:(与friend非成员)virtual,,,,,,,,,,,。finaloverridestaticconstvolatilemutable

问题:

在对象内存布局的上下文中,具有不同说明符的成员函数之间有什么区别以及它们如何影响它?


笔记:

我已经读过这个这个,它没有提供令人满意的答案2谈到了最接近重复的一般情况(我理解)。(但我特别关注有问题的语法列表,这是我的实际问题,并且没有在其中介绍。)

1.在影响对象内存布局方面。

2. 第一个是关于GCC 编译器的,第二个是关于 @m@zon 的书的链接。

4

1 回答 1

2

成员函数不是对象内存布局的一部分。唯一可归因于成员函数的是对用于执行动态调度的实现定义的结构的隐藏引用,例如虚拟方法表。仅当对象具有至少一个虚成员函数时,此引用才会添加到您的对象,因此不具有虚函数的类的对象不会产生这种开销。

回到您的具体问题,对对象的内存布局有任何影响的成员函数的唯一修饰符是virtual*。其他修饰符会影响函数本身的解释方式,但它们不会改变对象的内存布局。

* override关键字还表示基类中是否存在虚成员函数,但它是可选的;添加或删除它不会改变对象的内存布局。

于 2015-09-26T11:29:50.137 回答