Рассмотрим следующую простую структуру:
struct Struct {
public:
char a;
short int b;
char c;
};
Если экземпляры этой структуры размещаются по четному (с 16-разрядным выравниванием) адресу, для заполнения выравнивания требуются два байта заполнения (оба для b
и для любого следующего экземпляра в массиве).
Тем не менее, случаи мог быть размещены по нечетному адресу, и тогда выравнивание все равно будет правильным, даже без байтов заполнения.
Поэтому я сделал тест и заметил, что Visual C ++ 2010 добавит эти два байта заполнения, и это означает, что он всегда размещает их по четным адресам.
Почему бы VC ++ не размещать их по нечетным адресам, экономя 2 байта на каждый объект?
Есть ли что-то, о чем я не знаю?
Это правда, что если бы эта структура была размещена без заполнения, то она могла бы быть размещена по нечетному адресу, и каждый ее член, по отдельности, был бы правильно выровнен.
Проблема в том, как компилятор разместил бы его по нечетному адресу. Наверняка это может быть организовано для переменной автоматического хранения. Но как насчет кучи выделить переменную, выделенную malloc
? Контракт, который malloc
придерживается того, что он должен возвращать блок памяти, правильно выровненный для объектов любого типа. А также malloc
никогда бы не смог этого сделать, если бы были какие-то объекты, которые нужно было разместить по нечетным адресам.
Вы можете решить эту проблему, сделав так:
struct Struct{
public:
short int b;
char a;
char c;
};
Это вызывает sizeof(Struct) == 4
на многих компиляторах