【问题标题】:Do function definitions in a class take up part of the class's size? [duplicate]类中的函数定义是否占用了类大小的一部分? [复制]
【发布时间】:2013-04-04 10:03:27
【问题描述】:

假设:

Class A{
  float one;
  float two;
  float three;
 //... many, many member functions, and maybe static functions too ..
  }

我是否可以假设,无论这个类中有多少个函数,以下情况通常应该是正确的:

sizeof(A)==sizeof(float)*3

这样我什至可以断言:

static_assert(sizeof(A) == sizeof(float) * 3, "Your class is padding memory.");

这准确吗?

现在,假设 A 类继承自另一个类。我认为上述情况是正确的,而是您必须在sizeof 断言中包含从基类中添加 ivars 的大小?

【问题讨论】:

标签: c++


【解决方案1】:

如果“A 类”具有虚函数或派生自具有虚方法的类,则 sizeof(A) 不能通过手动对数据成员求和来准确确定。

这是因为编译器插入了一个名为 v-pointer 的隐藏指针,它指向 v-table。

如果你有虚拟基类,事情会变得更复杂,因为隐藏的 v-base-pointer 可能会被编译器插入。

此外,这些隐藏指针在多态 C++ 对象的内存模型中插入的位置在编译器实现中会发生变化(因为这些细节不是 C++ 标准的一部分)。 这就是为什么我们无法实现使用 C++ 开发的应用程序的二进制接口兼容性(编译一次并在所有平台上重用)的原因之一。 (同样,这是发明 .Net 和 Java 的另一个原因!)。

简而言之,“C++”中多态类的内存模型与“C”不匹配(这就是我们在 C++ 中使用 extern“C”的原因之一)。

【讨论】:

    【解决方案2】:
    many, many member functions, and maybe static functions too
    

    如果你的类A包含虚函数,那么

    sizeof(A)==sizeof(float)*3
    

    不会是真的,因为vtable/vptr 有额外的内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-03
      • 1970-01-01
      • 2019-01-12
      • 2013-11-02
      相关资源
      最近更新 更多