sizeof operator& C ++与D的对齐

时间:2016-06-15 04:54:04

标签: c++ d sizeof memory-alignment

考虑以下计划:

#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作为课程的输出&#39;大小。 D编译器如何在这里执行对齐?我是否错误地解释了什么?我正在使用Windows 7 32位操作系统和Dmd编译器。

1 个答案:

答案 0 :(得分:8)

D中的类是引用类型(即它们的工作方式类似于Java或C#)。当您声明类型T的变量(其中T是一个类)时,您只需声明一个类引用(默认情况下为null),这将指向实际课程的数据(示例中为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