Резюме. Как компилятор статически определяет размер класса С++ во время компиляции?
Подробнее:
Я пытаюсь понять, какие правила предназначены для определения того, сколько памяти будет использовать класс, а также как будет выровняться память.
Например, следующий код объявляет 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 байт, и это приводит к segfault когда компилятор генерирует код с помощью movaps
для доступа к данным.