我有两个问题:
此代码:
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 */
};
哪一个在内存使用方面更好,为什么???
答案 0 :(得分:5)
已婚有多少记忆?
int : 1
在sizeof(int)
的存储单元中占用一位内存。请注意,由于int
已签名且位域只有一位,因此这样的位域只能采用两个值:-1和0.
答案 1 :(得分:3)
这取决于编译器,也可能取决于构建时为编译器提供的选项。
紧密打包字段可能会降低访问性能,同时提高存储效率,这就是为什么它可以改变,例如告诉编译器优化速度。
位域永远不会占用内存中的CHAR_BITS
位,否则每个struct
实例的起始地址都不会落在精确的char
地址上,而且必须这样做。< / p>
所以第一个例子:
struct employee
{
char name[20];
int married :1;
};
可能意味着sizeof (struct employee)
占用24个字节,假设系统上sizeof (int)
为4。这意味着如果在married
之后添加了更多位域成员,则在添加31位字段之前,大小不会改变。
答案 2 :(得分:2)
当您使用int flage
存储有关已婚经理和子女的信息时,可以为一个对象占用2个字节的内存,并且每次访问> 特定信息您必须对flage
变量执行按位操作。因此,这将需要一些处理。
通过使用位域,如int married:1;
(你最好使用unsigned int
),这意味着它可能只需要 1个字节的内存,因此你可以节省内存(假设你的结构没有填充)。作为奖励,您可以直接访问其位。
所以关于内存和处理应该是更好的方法。
答案 3 :(得分:1)
选择最容易阅读的内容,以及最准确地捕获编码意图的内容。这种微观优化谈话完全不合适。如果您处于性能关键的内在循环中,那么它可能会变得很重要,但是其他技术会影响您的算法,CPU的缓存性能,循环展开,循环流水线和c。
只是为了重新迭代:为将要阅读您的代码的人编写代码。
您甚至可能会考虑以下内容:
struct employee
{
char name[31];
bool married;
enum manager_t manager;
...
};
如果您尝试将bool
(比方说)分配给employee::manager
,编译器会发出警告。