在C++,java中空类的大小是多少?

gar*_*ima 14 c++ java empty-class

C++和Java中空类的大小是多少?为什么不是零? sizeof();在C++的情况下返回1.

Mar*_*ork 26

简答:

该标准明确指出一个类的大小不能为零.

答案很长:

因为每个对象都需要一个唯一的地址(也在标准中定义),所以你不能真正拥有零大小的对象.
想象一下零大小的对象数组.因为它们的大小为零,所以它们都排在同一个地址位置.因此,更容易说对象的大小不能为零.

注意:

即使对象具有非零大小,如果它实际占用零空间,则不需要增加派生类的大小:

例:

#include <iostream>

class A {};
class B {};
class C: public A, B {};

int main()
{
     std::cout << sizeof(A) << "\n";
     std::cout << sizeof(B) << "\n";
     std::cout << sizeof(C) << "\n";  // Result is not 3 as intuitively expected.
}

g++ ty.cpp
./a.out
1
1
1
Run Code Online (Sandbox Code Playgroud)


Ste*_*n C 15

在Java案例中:

  • 没有简单的方法可以找出对象在Java中占用多少内存; 即没有sizeof操作员.
  • 对象的大小(空或非空)是特定于平台的.

"空类"(即Instrumentation)的实例的大小不为零,因为实例具有与之关联的隐式状态.例如,需要状态:

  • 这样对象就可以作为原始锁,
  • 表示其身份哈希码,
  • 指示对象是否已完成,
  • 引用对象的运行时类,
  • 保持对象的GC标记位,
  • 等等.

当前的Hotspot JVM使用巧妙的技巧来表示占用两个32位字的对象头中的状态.(这在某些情况下会扩展;例如,实际使用原始锁定时,或者在java.lang.Object调用之后.)