C++ 与 D 中的 sizeof 运算符和对齐

sizeof operator & alignment in C++ vs D

考虑以下程序:

#include <iostream>
class T {
  char c;
  int i;
};
int main() {
    std::cout<<sizeof(T)<<'\n';
}

由于对齐,它给出了预期的输出 8。 C++ 编译器添加 3 个字节的填充。但是如果我用 D 语言做同样的事情,它会给我完全出乎意料的输出。 (查看现场演示 here。)

import std.stdio;
class T {
  char c;
  int i;
}
int main() {
   writefln("sizeof T is %d",T.sizeof);
   writefln("sizeof char is %d",char.sizeof);
   writefln("sizeof int is %d",int.sizeof); 
   return 0;
}

我得到的输出是:

sizeof T is 4
sizeof char is 1
sizeof int is 4

sizeof(T) 怎么等于 4? 我期望得到 8 作为 class' 大小的输出。 D 编译器如何在此处执行对齐? 我我理解错了什么?我正在使用 Windows 7 32 位 OS & Dmd 编译器。

类 在 D 中是引用类型(即它们像在 Java 或 C# 中一样工作)。当你声明一个 T 类型的变量时(其中 T 是一个 class),你只是在声明一个 class 引用(它将是 null默认),它将指向实际的 class 数据(您的示例中的 char cint i)。因此,T.sizeof 仅测量引用的大小,它等于指针大小(结果 4 仅表示您的目标是 32 位平台)。

尝试将 T 声明为 struct:

import std.stdio;
struct T {
  char c;
  int i;
}
int main() {
   writefln("sizeof T is %d",T.sizeof);
   writefln("sizeof char is %d",char.sizeof);
   writefln("sizeof int is %d",int.sizeof); 
   return 0;
}

在我的机器上,以上输出:

sizeof T is 8
sizeof char is 1
sizeof int is 4