2

认为:

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 的大小?

4

2 回答 2

1

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

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

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

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

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

于 2013-04-12T02:08:05.817 回答
0
many, many member functions, and maybe static functions too

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

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

不会是真的,因为vtable/vptr.

于 2013-04-12T01:59:00.067 回答