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

2022-09-03 08:34:23

C++和Java中空类的大小是多少?为什么不是零? 如果是C++,则返回 1。sizeof();


答案 1

C++简答:

C++标准明确指出,类的大小不能为零。

C++的长答案:

由于每个对象都需要具有唯一的地址(也在标准中定义),因此您实际上不能拥有零大小的对象。
想象一个零大小的对象数组。由于它们的大小为零,因此它们将全部排列在同一地址位置。因此,更容易说对象不能具有零大小。

注意:

即使对象的大小不为零,如果它实际上占用零空间,也不需要增加派生类的大小:

例:

#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

答案 2

在 Java 案例中:

  • 在Java中,没有简单的方法来找出对象占用了多少内存;即没有操作员。sizeof
  • 有几种方法(例如使用或第三方库)可以给你一个数字,但含义是微妙的1;请参阅在 Java 中,确定对象大小的最佳方法是什么?Instrumentation
  • 对象的大小(空或非空)是特定于平台的。

“空类”(即 )的实例的大小不为零,因为该实例具有与之关联的隐式状态。例如,需要状态:java.lang.Object

  • 以便对象可以用作基元锁,
  • 表示其身份哈希码,
  • 以指示对象是否已定版,
  • 引用对象的运行时类,
  • 以保存对象的 GC 标记位,
  • 等等。

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


1 - 例如,由新 String(“hello”) 创建的字符串对象的大小是否包括保存字符的支持数组的大小?从 JVM 的角度来看,该数组是一个单独的对象!


推荐