Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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,给定一个复杂的数据结构,其中每个子结构都有一个域为{true或false}的变量 (例如) 对于1或0的值,仅使用1字节是一种浪费。是否有一种C语言技术,使每个节点中的状态只占用字节中的一位?我能想到的是使用宏,但宏不能包含在本地范围内,对吗?因此,具有宏状态意味着程序中只有一个宏状态。因此,调用node1.status和node2.status使用相同的宏 您可以使用位字段-此语法允许您定义strct中每个int应该占用多少位。 但是,请注意,C只能分配完整字节,因此在任何情况下,结构的大小都

给定一个复杂的数据结构,其中每个子结构都有一个域为{true或false}的变量

(例如)


对于1或0的值,仅使用1字节是一种浪费。是否有一种C语言技术,使每个节点中的状态只占用字节中的一位?我能想到的是使用宏,但宏不能包含在本地范围内,对吗?因此,具有宏状态意味着程序中只有一个宏状态。因此,调用node1.status和node2.status使用相同的宏

您可以使用位字段-此语法允许您定义strct中每个int应该占用多少位。 但是,请注意,C只能分配完整字节,因此在任何情况下,结构的大小都将向上舍入到最接近的8位乘法

例如:


话虽如此,我真诚地怀疑您是否会注意到使用此技术带来的任何性能提升,正如Fredrick Gauss评论的那样,这可能不值得这么麻烦。

C有一个名为位字段的内置功能,可以完成这项工作

基本上,位字段会自动优化结构,以便只使用每个给定成员所需的内存。在你的情况下,你会这样做

struct statusNode {
  /* ... */

  /* only use 1 bit for this member */
  unsigned int status : 1;

  /* for example, test only needs 4 bits (range of 0 to 15) */
  unsigned int test : 4;
};

struct dataBlock {
    struct statusNode node1;

    /* ... */

    struct statusNode node2;
};
您可以根据遇到的最高值为每个成员分配一定数量的位


您可以找到有关位字段的更多信息。

Duplicate:不要费心考虑位/字节。因为在结构中使用不同类型的变量时会出现填充。另外请注意,其他语言使用字节来表示布尔数据。不要费心考虑在小程序中节省内存,因为它不会给您带来任何改进,但实际上可能会增加程序大小和速度,因为它需要更多的指令来处理位,而不是整个int上只有一条指令。只有程序和堆栈启动通常需要兆字节的内存,而保存1或2字节并不意味着什么。只有对于经常访问的可能会产生大量缓存未命中的非常大的数组,才应该更改数据表示以保存内存如果存在位字段,则声明的自动转换为压缩表示至少对gcc无效,因为gcc需要显式声明。例如,32位机器上的三个连续20位字段将放在3个4字节的字中,除非为结构设置了_属性_((压缩))。我可以有一个指向半_int的int指针吗?这样它就可以显示半个整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型整型
struct {
    int whole_int; /* a whole int, let's assume it's 16 bits. */
    int half_int : 8; /* only half an int */
    int another_half_int : 8;
} some_struct /* Total size is 2 bytes*/
struct statusNode {
  /* ... */

  /* only use 1 bit for this member */
  unsigned int status : 1;

  /* for example, test only needs 4 bits (range of 0 to 15) */
  unsigned int test : 4;
};

struct dataBlock {
    struct statusNode node1;

    /* ... */

    struct statusNode node2;
};