2015-02-18 4 views
1

, предполагающих У меня есть такой код:SizeOf (Struct) различный для разных компиляторов

#include <stdio.h> 
#include <stdint.h> 
int main(int argc, char *argv[]) { 
    typedef struct{ 
     uint16_t x : 9; 
     uint8_t y : 7; 
    } z; 
    printf("sizeof(z) = %lu\n",sizeof(z)); 
} 

У меня есть разные результаты для лязга на Mac (2), и кто-то сказали мне на Windows, он вернулся (3). Не уверен, насколько я это хорошо понимаю, но я вижу, что, хотя первый компилятор сжимает структуру до 9 + 7 = 16 бит, другой использует 16 бит uint16_t и 8 из uint8_t. Не могли бы вы посоветовать?

+0

советую * что? * что вы хотите? почему ты беспокоишься? конечно, разные компиляторы на разных платформах делают разные вещи, когда дело доходит до деталей реализации ... –

+1

Прочтите это http://stackoverflow.com/questions/18284640/c-size-of-structure-when-bit-field-is-used- and-how-it-is-stored-in-memory – Matt

+0

Если вы не вставляете неназванные битовые поля нулевого размера, вы ничего не можете принять за макет битового поля. –

ответ

3

Не уверен, что я это хорошо понимаю, но я вижу, что, хотя первый компилятор сжимает структуру до 9 + 7 = 16 бит, другой использует 16 бит uint16_t и 8 из uint8_t. Не могли бы вы посоветовать?

Первое, что нужно помнить о битовое поле эта фраза из K & R, второй:

(6.9 Битовые поля) «Почти все о полях, зависит от реализации.»

Включает в себя прокладку, выравнивание и согласованность бит.

0

Есть два возможных проблем, которые могут иметь место:

Битовые поля очень слабо Стандартизированная часть в пределах спецификации ANSI C. Компилятор выбирает, как распределяются биты в контейнере бит-поля. Вы должны избегать использования их внутри структур, вместо этого вы можете использовать #define или enum.

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

typedef struct{ 
     uint8_t x : 7; 
     uint16_t y : 9; 
    } z; 
Смежные вопросы