почему бы не исключить необходимость заполнения байтов относительно этой структуры?

Рассмотрим следующую простую структуру:

struct Struct {
public:
char  a;
short int b;
char  c;
};

Если экземпляры этой структуры размещаются по четному (с 16-разрядным выравниванием) адресу, для заполнения выравнивания требуются два байта заполнения (оба для b и для любого следующего экземпляра в массиве).

Тем не менее, случаи мог быть размещены по нечетному адресу, и тогда выравнивание все равно будет правильным, даже без байтов заполнения.

Поэтому я сделал тест и заметил, что Visual C ++ 2010 добавит эти два байта заполнения, и это означает, что он всегда размещает их по четным адресам.

Почему бы VC ++ не размещать их по нечетным адресам, экономя 2 байта на каждый объект?
Есть ли что-то, о чем я не знаю?

1

Решение

Это правда, что если бы эта структура была размещена без заполнения, то она могла бы быть размещена по нечетному адресу, и каждый ее член, по отдельности, был бы правильно выровнен.

Проблема в том, как компилятор разместил бы его по нечетному адресу. Наверняка это может быть организовано для переменной автоматического хранения. Но как насчет кучи выделить переменную, выделенную malloc? Контракт, который malloc придерживается того, что он должен возвращать блок памяти, правильно выровненный для объектов любого типа. А также malloc никогда бы не смог этого сделать, если бы были какие-то объекты, которые нужно было разместить по нечетным адресам.

5

Другие решения

Вы можете решить эту проблему, сделав так:

struct Struct{
public:
short int b;
char a;
char c;
};

Это вызывает sizeof(Struct) == 4 на многих компиляторах

2

По вопросам рекламы [email protected]