【发布时间】:2015-07-14 07:20:21
【问题描述】:
在一个结构中,我们通常有连续的位域;也就是一个接一个地相邻——例如:
struct demo
{
char a;
char b:1;
char c:2;
char d:2;
int e;
} demo1;
demo1 的大小将是 8 个字节:
- 大小 =
a(1 字节) + 位域(1 字节) + 间隙(2 字节) +e(4 字节))
现在考虑以下结构:
struct demo
{
char a;
int b:1;
char c;
char d;
int e:2;
} demo1;
当我使用 sizeof(demo1) 时,它给了我 8 个字节——但我想知道这些位域在内存中是如何呈现的。
如果像上面这样计算结构尺寸应该是:
- 大小 =
a(1 字节) +b(4 字节) +c(1 字节) +d(1 字节) +e(4 字节)
在编程过程中,我们不关心如何使用sizeof 计算大小,甚至不在两个不同的位置使用位域,但有时面试官会问这种类型的问题。
【问题讨论】:
-
这个答案取决于很多事情。如果您的编译器重新排列结构元素,请不要感到惊讶。 :-)
-
编译器是否有能力重新排列元素?
-
我现在不能引用一些东西(跑去吃午饭),但是 AFAIK,是的。
-
@SouravGhosh:编译器无权重组结构。
a的地址必须在包含b的单元的地址之前,它必须在c的地址之前,它必须在d的地址之前,它必须在单元的地址之前包含e。
标签: c structure bit-fields