摘要:编译器如何在编译过程中静态确定 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
用于访问数据的代码。