Выравнивание при использовании длинного двойника в структуре - PullRequest
1 голос
/ 25 апреля 2020

В общем, я знаю, что экземпляр структуры будет иметь выравнивание самого широкого скалярного члена. Я объявил структуру, имеющую член типа данных long double.

struct try
{
    char a;
    long double b;
};
struct try obj;

Когда я попытался проверить sizeof(obj), он выглядит как 16. Мой компилятор принимает long double как 12 байтов. Поэтому я не могу понять, как именно здесь выполняется заполнение и как происходит выравнивание в структуре. Я предполагал, что выравнивание будет выполнено на основе long double, поскольку это самый широкий скалярный член. Таким образом, для char должно быть заполнено байтами 11, а размер структурной переменной должен быть равен 24, а вывод - 16. Так что именно здесь происходит? Я работаю на 64 bit процессоре.

1 Ответ

3 голосов
/ 25 апреля 2020

Прежде всего, ваш компилятор создает 32-битный вывод, даже если у вас 64-битный процессор. В любом случае, вы предполагаете, что вещи должны быть выровнены по границе, идентичной их размеру, что в общем случае неверно. В частности, в вашем случае long double s занимают 12 байтов, но должны быть выровнены только по 4-байтовой границе. Таким образом, после вашего однобайтового char компилятор вставляет 3 байта заполнения, чтобы добраться до 4-байтовой границы, а затем вставляет ваш 12-байтовый long double. 1 + 3 + 12 равно 16, поэтому struct try имеет длину 16 байтов.

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