0

我有两个问题:

这段代码:

   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 */
};

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

4

4 回答 4

5

结婚的记忆有多少?

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

于 2012-09-09T11:24:11.253 回答
3

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

紧密地打包字段可能会降低访问性能,同时提高存储效率,这就是为什么如果您告诉编译器优化速度,它可能会改变。

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

所以第一个例子:

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

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

于 2012-09-09T11:20:26.910 回答
2

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

通过使用位域,比如int married:1;(你最好使用unsigned int),这意味着它可能只占用1 字节的内存,因此你可以节省内存(假设你的结构没有被填充)。作为奖励,您可以直接访问它的位

所以它应该是关于内存和处理的更好方法。

于 2012-09-09T12:25:31.907 回答
1

选择最容易阅读、最准确地捕捉编码意图的那个。这种微优化谈话完全不合适。如果您处于性能关键的内-内-循环中,这可能会变得很重要,但是其他技术会影响您的算法、CPU 的缓存性能、循环展开、循环流水线等。

只是为了重新迭代:要阅读您的代码的人的代码。

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

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

如果您尝试将 a bool(比如说)分配给employee::manager.

于 2012-09-09T11:34:59.170 回答