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 c
和 int 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
考虑以下程序:
#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 c
和 int 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