[英]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 : 1
在sizeof(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.