Почему размер структуры кратен 8, когда состоит из переменной int64 в 32-битной системе - PullRequest
1 голос
/ 18 февраля 2011

В языке программирования C, и я использую 32-битную систему, у меня есть структура, и этот размер структуры кратен четырем.Но я смотрю на файл карты компоновщика, и его размер кратен восьми.32-битный ARM микроконтроллер.Я не знаю, почему

Ответы [ 4 ]

3 голосов
/ 18 февраля 2011

Первая структура дополняется для выравнивания по границе U64: она эквивалентна

struct STR
{
    U64 var1;
    U32 var2;
    U8  pad[4]; /* sizeof(U64) - sizeof(U32) */
};

Так что при использовании в массиве struct STR [] каждый U64 хорошо выровнен относительнок требованиям ABI.

Взгляните на Стандарт вызова процедур для архитектуры ARM , 4.1 Основные типы данных.

1 голос
/ 18 февраля 2011

Немного предыстории, чтобы помочь вам разобраться в таких проблемах.

Поскольку операции примитивной памяти обычно задаются с кратными 8, инженеры компилятора выбирают схемы заполнения для структур данных в памяти.

Если операция извлечения памяти (memory -> bus -> cpu) будет 16-битной (на гипотетическом компьютере), и вы добавите 3 * 8-битные типы в вашу структуру, конструктор компилятораможет также дополнить его до 32-битной структуры, поскольку в 2,16-битной памяти будут выполняться операции извлечения, чтобы вытащить вашу структуру в кэш-память CPU для операций с процессором.компилятор не должен делать это в исключительных обстоятельствах, таких как разработка протокола на диске или сетевого протокола, когда вы, возможно, захотите быть космически сознательным.

В реальном мире такие проблемы более сложны, но решения принимаютсяИз того, что лучший выбор для общего использования вашего оборудования: D

1 голос
/ 18 февраля 2011

Размер структуры определяется как кратное выравнивания элемента с наибольшим требованием выравнивания.Похоже, что требование выравнивания U64 составляет 8 байтов даже в 32-битном режиме на вашей платформе.

Следующий код:

#include <stdio.h>
#include <stdint.h>
int main() { printf("alignof(uint64_t) is %zu\n", __alignof(uint64_t)); }

Создает один и тот же вывод при компиляции в обоих 32-битный и 64-битный режим в Linux x86_64:

alignof(uint64_t) is 8
1 голос
/ 18 февраля 2011

Заполнение.

Предположим, у вас есть

typedef struct _str
{
U64 var1,
U32 var2
} STR;

STR s[2];

Ваша архитектура может потребовать, чтобы s[0].var1 и s[1].var1 лежали на естественном выравнивании для U64, на 8-байтовых границах,Поскольку C не добавляет заполнение между элементами массива, заполнение идет внутри структуры.

С другой стороны,

typedef struct _str
{
U32 var1,
U32 var2,
U32 var3
} STR2;

STR2 s2[2];

Здесь требуется только 4-байтовое выравнивание.

...