【问题标题】:How member functions' additional syntax/specifiers affect memory layout in classes?成员函数的附加语法/说明符如何影响类中的内存布局?
【发布时间】:2015-12-24 03:15:20
【问题描述】:

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

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

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

我想不通的类成员函数:

  • 函数类型:lambda,函数指针,正在修改不可修改
  • 包含额外的语法元素:friend(with non-member)、virtualfinaloverridestaticconstvolatilemutable

问题:

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


注意:

我已经阅读了thisthis,它们并没有提供令人满意的答案2This 谈论一般情况(我理解),这是最接近重复的情况。(但我特别关注有问题的语法列表,这是我的实际问题,没有涉及到。)

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

2。第一个是关于 GCC 编译器,第二个提供了指向 @m@zon 上一本书的链接。

【问题讨论】:

  • 成员函数不影响对象布局。访问修饰符不影响对象布局。静态成员不是对象的一部分,它们是类的一部分。
  • @simplicisveritatis virtual 是唯一可能影响类内存布局的修饰符。
  • 对象不知道这一点。这一切都在编译时处理。
  • 是的,它们是非常相似的概念。
  • 没错。 C++ 类基本上类似于 C 结构。除了虚成员函数之外的所有内容都在编译器中处理,方法是限制可以引用名称的位置,并对成员函数和重载进行名称修改。

标签: c++ member-functions object-layout


【解决方案1】:

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

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

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

【讨论】:

  • 是否有任何其他可能影响对象内存布局的附加语法(未包含在我的列表中)(只是想确保涵盖任何我不知道的说明符)?刚才我想到了functors作为类成员类型,比如。
  • @simplicisveritatis lambda、仿函数和函数指针是常规数据成员。您可以调用它们的事实,甚至它们可以访问您的类的数据成员的事实,并不使它们成为成员函数。它们是数据成员,因此它们以与“常规”数据成员相同的方式放置在内存中,例如ints 和指针。
猜你喜欢
  • 2015-03-19
  • 2017-12-17
  • 2016-01-08
  • 1970-01-01
  • 2023-04-04
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多