【发布时间】:2013-01-24 21:03:32
【问题描述】:
总结:编译器如何在编译过程中静态确定C++类的大小?
详情:
我试图了解用于确定类将使用多少内存以及如何对齐内存的规则。
例如,以下代码声明了 4 个类。前 2 个各 16 个字节。但是 3 是 48 字节,尽管它包含与前 2 相同的数据成员。而第四类与第三类具有相同的数据成员,只是顺序不同,但它是 32 字节。
#include <xmmintrin.h>
#include <stdio.h>
class TestClass1 {
__m128i vect;
};
class TestClass2 {
char buf[8];
char buf2[8];
};
class TestClass3 {
char buf[8];
__m128i vect;
char buf2[8];
};
class TestClass4 {
char buf[8];
char buf2[8];
__m128i vect;
};
TestClass1 *ptr1;
TestClass2 *ptr2;
TestClass3 *ptr3;
TestClass4 *ptr4;
int main() {
ptr1 = new TestClass1();
ptr2 = new TestClass2();
ptr3 = new TestClass3();
ptr4 = new TestClass4();
printf("sizeof TestClass1 is: %lu\t TestClass2 is: %lu\t TestClass3 is: %lu\t TestClass4 is: %lu\n", sizeof(*ptr1), sizeof(*ptr2), sizeof(*ptr3), sizeof(*ptr4));
return 0;
}
我知道答案与类的数据成员的对齐有关。但是我试图准确地理解这些规则是什么以及它们在编译步骤中是如何应用的,因为我有一个具有__m128i 数据成员的类,但该数据成员不是 16 字节对齐的,这会导致段错误当编译器使用movaps 生成代码来访问数据时。
【问题讨论】:
-
规则完全是实现定义的,你应该检查你的编译器的文档。此外,几乎所有编译器都允许您使用
#pragma或属性为类成员指定所需的对齐方式。 -
“数据成员未对齐”:然后您在指针/引用转换、自定义分配或类似方面做了一些不愉快的事情。
标签: c++ memory-alignment