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

Des*_*tor 4 c++ d sizeof memory-alignment

考虑以下计划:

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

8由于对齐,它将输出作为预期.C++编译器添加3个字节的填充.但如果我用D语言做同样的事情,它会给我完全意想不到的输出.(在这里查看现场演示.)

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;
}
Run Code Online (Sandbox Code Playgroud)

我得到的输出是:

sizeof T is 4
sizeof char is 1
sizeof int is 4
Run Code Online (Sandbox Code Playgroud)

sizeof(T)4怎么样?我期待得到8作为班级规模的输出. D编译器如何在这里执行对齐?我错了什么吗?我正在使用Windows 7 32位OS和Dmd编译器.

Vla*_*eev 8

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

尝试声明Tstruct:

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;
}
Run Code Online (Sandbox Code Playgroud)

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

sizeof T is 8
sizeof char is 1
sizeof int is 4
Run Code Online (Sandbox Code Playgroud)