繁体   English   中英

位结构域

[英]Bit-Sized structure field

我有两个问题:

这段代码:

   struct employee
   {
      char name[20];
      int married :1;
   };

已婚的人要记多少次?

如果我有多个位大小的字段,将它们放在相同的变量中以保持它们的独立性是否很好?

喜欢:

struct employee
{
 char name[31];
 int married :1;
 int manager :2;
 int children :4;
};

要么

struct employee
{
 char name[31];
 int flage; /* one bit for married, one for manager, and 4 bits for children */
};

哪一个在内存使用方面更好,为什么?

已婚的人要记多少次?

int : 1sizeof(int)的存储单元中占用一位内存。 请注意,因为int是带符号的,并且位域只有一位,所以这样的位域只能采用两个值:-1和0。

这取决于编译器,还可能取决于您在构建时为编译器提供的选项。

紧密打包字段可能会降低访问性能,同时提高存储效率,因此,如果您告诉编译器进行速度优化,则它可能会更改。

位域在内存中永远不能占用少于CHAR_BITS位,因为否则每个struct实例的起始地址都不会落在确切的char地址上,而必须这样做。

所以第一个例子:

struct employee
{
    char name[20];
    int married :1;
};

假设您的系统上的sizeof (int)为4,则可能意味着sizeof (struct employee)占用了24个字节。 这意味着,如果您在married后添加了更多的位域成员,则大小不会改变,直到您添加了31位的域。

当您使用int flage存储有关已婚经理和子女的信息时,可能为一个对象占用2个字节的内存 ,并且每次您必须访问特定信息时,都必须flage变量执行按位运算 因此,这将需要一些处理。

通过使用位域,例如int married:1; (最好使用unsigned int ),这意味着它可能只占用1个字节的内存 ,因此可以节省内存(假设您的结构未填充)。 另外,您可以直接访问其位

因此,对于内存和处理,这应该是更好的方法。

选择最容易阅读的哪个,最准确地抓住您的编码意图。 这种微优化的说法是完全不合适的。 如果您处于性能至关重要的内部循环中,则可能会变得很重要,但是随后其他技术(例如算法),CPU的缓存性能,循环展开,循环流水线处理等也会影响到其他技术。

只是重申一下:将要阅读您的代码的人的代码。

您甚至可能会考虑以下内容:

struct employee
{
    char name[31];
    bool married;
    enum manager_t manager;
    ...
};

如果您尝试将bool (例如)分配给employee::manager ,编译器会在此处警告您。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM