Слабый байт в структурах C - PullRequest
       4

Слабый байт в структурах C

4 голосов
/ 04 сентября 2011

Мне известна концепция границы слова, при которой компьютер сохраняет структуры, используя границу слова.Я работаю на 64-битном процессоре с 64-битной ОС.Значение макроса __WORDSIZE в limit.h равно 64. Таким образом, граница моего слова равна 8 байтам?,sizeof (int) равно 4. sizeof (float) равно 4.

For struct b{
char a;
char b;
char c;
char d;
};

sizeof (struct b) равно 4.

Эти выходные данные предполагают, что граница слова составляет 4 байта.Как мне найти границу слова.Тогда действительно ли он равен sizeof (int)?

Странно:

struct c{
char a;
char b;
char c;
char d;
char e;
}

sizeof (struct c) составляет 5 байтов.Может кто-нибудь объяснить это, пожалуйста.

Ответы [ 2 ]

5 голосов
/ 04 сентября 2011

Прежде всего, __WORDSIZE не для вас, чтобы проверить. Вы никогда не должны использовать макросы (или другие имена), начинающиеся с __ или _ и заглавные буквы, если они специально не задокументированы для вашего использования. Это внутренняя часть реализации, используемая заголовками, и реализация может удалить или переименовать ее в более поздней версии. Другие системы могут вообще не иметь соответствующего макроса или иметь другое имя.

С учетом вышесказанного, выравнивание структуры не имеет ничего общего с собственным размером слова. Это связано с выравниванием отдельных элементов конструкции.

Смотрите мой ответ на этот вопрос:

Как gcc вычисляет необходимое пространство для структуры?

3 голосов
/ 04 сентября 2011

В struct a у вас есть 4-байтовое целое число, 1-байтовый символ, заполнение 3 байта для выравнивания float по 4-байтовой границе и 4 байта для float. На некоторых машинах и для некоторых структур у вас может быть до 7 байт, заполненных между char и следующими double, как в struct f:

struct f
{
    char   a;
    double b;
};

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

При struct c компилятор может размещать последовательные элементы без каких-либо дополнений, поскольку ни один из элементов в структуре не требует более строгого выравнивания. Если у вас было:

struct d
{
    short a;
    char  b;
    char  c;
    char  d;
};

было бы разумно ожидать, что размер будет 6 (если не 8), потому что short должен быть выровнен на 2-байтовой границе.

struct e
{
    int   a;
    char  b;
};

На многих платформах sizeof(struct e) будет 8, потому что структура должна быть выровнена в 4 байта.

Макрос __WORDSIZE имеет мало общего с этим. Это не стандартизированный макрос.

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