2010-01-15 42 views
6
  • 位域是C概念还是C++?关于C位域的问题

  • 它只能在结构中使用吗?我们还可以使用其他什么地方?

  • AFAIK,位域是特殊的结构变量,它只占用指定的内存空间。的位。它在节省内存和其他方面很有用。 我正确吗?

我编写了一个小程序,了解位域的使用 - 但是,我认为按预期的方式是行不通的。我期望以下结构的大小为1 + 4 + 2 = 7个字节(考虑到unsigned int的大小在我的机器上是4个字节),但令我惊讶的是它变成了12个字节(4 + 4 + 4 )。 任何人都可以让我知道为什么吗?

#include <stdio.h> 

struct s{ 
unsigned int a:1; 
unsigned int b; 
unsigned int c:2; 
}; 

int main() 
{ 
    printf("sizeof struct s = %d bytes \n",sizeof(struct s)); 
    return 0; 
} 

OUTPUT:

sizeof struct s = 12 bytes 

回答

10

因为ac是不连续的,他们各自保留的内存空间全INT的价值。如果将ac一起移动,则结构的大小将变为8个字节。

此外,您正在告诉编译器,您希望a仅占用1个,而不是1个字节。因此,尽管相邻的ac只应占用总共3位(仍低于一个字节),但ac的组合仍然在32位机器的内存中成为字对齐的,因此占用全部4个字节除了int b

同样,你会发现

struct s{ 
unsigned int b; 
short s1; 
short s2; 
}; 

占用8个字节,而

struct s{ 
short s1; 
unsigned int b; 
short s2; 
}; 

占用12个字节,因为在后一种情况下,每个所述两个短裤坐在他们自己的32位对准。

6

1)它们起源于C,但不幸的是它们也是C++的一部分。

2)是,或者在C++的类中。

3)除了节省内存外,它们还可以用于某些形式的位移。然而,内存节省和旋转本身都取决于实现 - 如果你想写便携式软件,避免位域。

+0

对于downvoter--你不赞同哪些陈述? – 2010-01-15 12:11:19

+0

+1:'依赖于实现'和'避免位域'是关键。 – 2010-01-15 13:50:22

+0

关于内存节省,我会在这里部分不同意:随意指定位域,它们可能会减少结构的内存占用量。但是千万不要试图对他们很聪明,有七次从不指望编译器会用它们做什么。 – dmckee 2010-01-16 03:17:12

0

及其C.

你comiler具有圆形的存储器分配到用于对准目的的12个字节。大多数计算机内存syubsystems不能处理字节寻址。

+0

你的意思是“位寻址”,对吧? – SoapBox 2010-01-15 12:11:08

0

你的程序工作正如我所料。编译器将相邻的位域分配到相同的存储器字中,但是你的信号被非位域隔开。

将位域彼此相邻,您可能会得到8,这是您机器上两个整数的大小。位域将被打包成一个int。然而,这是编译器特有的。

位域对于节省空间非常有用,但不是其他的。

0

位域被广泛用于固件来映射寄存器中的不同字段。这节省了很多手动按位操作,而这些操作在没有它的情况下读取/写入字段是必需的。 一个缺点是你无法获取位域的地址。