Чтобы прояснить мой вопрос, давайте начнем с примера программы:Что делает VC++ при упаковке битполей?
#include <stdio.h>
#pragma pack(push,1)
struct cc {
unsigned int a : 3;
unsigned int b : 16;
unsigned int c : 1;
unsigned int d : 1;
unsigned int e : 1;
unsigned int f : 1;
unsigned int g : 1;
unsigned int h : 1;
unsigned int i : 6;
unsigned int j : 6;
unsigned int k : 4;
unsigned int l : 15;
};
#pragma pack(pop)
struct cc c;
int main(int argc, char **argv)
{ printf("%d\n",sizeof(c));
}
Выход есть «8», а это означает, что 56 бит (7 байт) Я хочу, чтобы упаковать в настоящее время упакованы в 8 байт, казалось бы, теряя весь байт. Любопытный о том, как компилятор закладывал эти биты в памяти, я пытался писать конкретные значения &c
, например:
Int основной (интермедиат ARGC, символ ** ARGV)
{
unsigned long long int* pint = &c;
*pint = 0xFFFFFFFF;
printf("c.a = %d", c.a);
...
printf("c.l = %d", c.l);
}
Как и следовало ожидать, на x86_64, используя Visual Studio 2010, происходит следующее:
*pint = 0x00000000 000000FF :
c[0].a = 7
c[0].b = 1
c[0].c = 1
c[0].d = 1
c[0].e = 1
c[0].f = 1
c[0].g = 0
c[0].h = 0
c[0].i = 0
c[0].j = 0
c[0].k = 0
c[0].l = 0
*pint = 0x00000000 0000FF00 :
c[0].a = 0
c[0].b = 0
c[0].c = 0
c[0].d = 0
c[0].e = 0
c[0].f = 0
c[0].g = 1
c[0].h = 127
c[0].i = 0
c[0].j = 0
c[0].k = 0
c[0].l = 0
*pint = 0x00000000 00FF0000 :
c[0].a = 0
c[0].b = 0
c[0].c = 0
c[0].d = 0
c[0].e = 0
c[0].f = 0
c[0].g = 0
c[0].h = 32640
c[0].i = 0
c[0].j = 0
c[0].k = 0
c[0].l = 0
т.д.
Забудьте портативность на минуту и предположим, что вы заботитесь о один процессор, один компилятор , и одна среда выполнения. Почему VC++ не может упаковать эту структуру в 7 байт? Это вещь длиной в слово? В на #pragma pack
говорится, что «выравнивание элемента будет на границе, либо кратном n [1 в моем случае], либо кратной размеру члена, в зависимости от того, что меньше». Может ли кто-нибудь дать мне некоторое представление о том, почему я получаю sizeof 8, а не 7?
В документации говорится: «... будет на границе, которая ...»; однако я не могу найти, где он говорит что-либо о гарантии размера. – 2010-10-12 21:38:40