Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 位大小结构字段_C - Fatal编程技术网

C 位大小结构字段

C 位大小结构字段,c,C,我有两个问题: 此代码: struct employee { char name[20]; int married :1; }; 结婚能记住多少 如果我有多个位大小的字段,那么把它们放在同一个变量中,保持它们的独立性,对吗 比如: 或 哪一个在内存使用方面更好?为什么?这取决于编译器,也可能取决于您在构建时为编译器提供的选项 将字段紧密打包可能会降低访问性能,同时提高存储效率,这就是为什么如果您(例如)告诉编译器优化速度,它可能会发生变化的原因 位字段

我有两个问题:

此代码:

   struct employee
   {
      char name[20];
      int married :1;
   };
结婚能记住多少

如果我有多个位大小的字段,那么把它们放在同一个变量中,保持它们的独立性,对吗

比如:


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

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

将字段紧密打包可能会降低访问性能,同时提高存储效率,这就是为什么如果您(例如)告诉编译器优化速度,它可能会发生变化的原因

位字段在内存中的占用量永远不能少于CHAR_位,因为否则每个结构实例的起始地址不会落在一个精确的CHAR地址上,而它必须这样做

第一个例子是:

struct employee
{
    char name[20];
    int married :1;
};
这可能意味着sizeof struct employee占用24个字节,假设系统上的sizeof int为4。这意味着,如果在结婚后添加更多的位字段成员,则在添加31位字段之前,大小不会改变

结婚能记住多少


int:1在sizeofint的存储单元中占用一位内存。请注意,由于int是有符号的,并且位字段只有一位,因此这样的位字段只能取两个值:-1和0。

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

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

你甚至可能会想一些类似的事情:

struct employee
{
    char name[31];
    bool married;
    enum manager_t manager;
    ...
};
如果您试图将bool say分配给employee::manager,编译器将在此警告您。

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

通过使用位字段,如int:1;您最好使用unsigned int,这意味着它可能只需要1字节的内存,因此如果您的结构没有填充,您可以节省内存。作为奖励,您可以直接访问其位


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

对不起,还有一个问题,但是int结合了什么:1;是什么意思?这是一个有点大的结构域。已婚人士:1人;;这意味着我只需要整数变量中的一位,而不是32位。您的计算机中可能有数十亿字节。为什么要费心去救一个或两个呢?这不是很有效,也可能会引入额外的错误-比如不为有超过16个孩子的人工作。对不起,我不明白你的意思??我是C语言的初学者。为了完整起见,它也可能会随着pragma pack之类的对齐指令而改变。+1对于关于带符号的1位字段是个坏主意的注释,我忘了在我的答案中包含它。好的,这完全不准确。int-flage可能占用2个字节,这是标准要求的最小存储大小,但是,它很可能占用4个字节。您可以使用printf%zu\n,sizeofint;轻松检查这一点;。至于位字段,它可能不会真正保存任何内存,因为它的存储将与字边界对齐,除非您另有指定。@jweyrich当我完成sizeoffint时,我得到的答案是2byte,当我完成int a:1;sizeofa我得到的答案是1字节,所以int部分我说得对,但使用:可能会被我误解。因为它占用的是1字节的空间,而不是1字节的空间,所以我对此表示歉意。但仍然1字节小于2字节,因此内存效率很高。我建议您更新您的答案以反映这一点。正如我所说,flage可能是2个字节,而您的答案断言它将是2个字节。位字段可能需要1个字节。当sizeofname+sizeofflage结果为35时,结构将被额外填充1个字节,避免与4个字节的边界不对齐。如果您不希望出现这种填充。请注意,现在sizeofstruct employee==sizeofname+sizeofflage。抱歉,我太挑剔了。@jweyrich我使用的是windows XP3,当我运行您的代码时,它显示flage需要2字节,struct employee只需要33字节。我认为你所说的是基于计算机操作系统的,为了更快的访问,有时会填充额外的字节。由于我只是一个学习者,所以我说了我从这里学到的东西,而不关心细节。。非常抱歉。我会把我的答案修改得更精确。但朋友,作者的主要问题是从位大小的字段或整数鞭毛中选择什么?我回答说我认为我建议他只去一点大小的场地是对的,不是吗?是的。虽然你的推理是正确的,但你的解释是错误的,因为你是我们的 我们不涉及其他可能性。编译器给出的结果并不保证其他人也会得到同样的结果。没什么私事,这是我开始辩论的唯一原因。
struct employee
{
    char name[20];
    int married :1;
};
struct employee
{
    char name[31];
    bool married;
    enum manager_t manager;
    ...
};