要約:コンパイラーは、コンパイル中にC ++クラスのサイズを静的にどのように決定しますか?
詳細:
クラスが使用するメモリの量を決定するためのルールと、メモリがどのように調整されるかを理解しようとしています。
たとえば、次のコードは4つのクラスを宣言しています。最初の2つはそれぞれ16バイトです。ただし、3は最初の2と同じデータメンバーを含んでいますが、48バイトです。4番目のクラスは3番目と同じデータメンバーを持っていますが、順序が異なりますが、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
データへのアクセスに使用するコードを生成します。