struct中的位域位置

时间:2016-09-01 02:50:39

标签: c memory struct bit-fields memory-efficient

鉴于有一些不相关的标志( .cover-image { position: relative; z-index: 1; background: #D3D3D3 url("../images/surfers.jpeg"); background-position:center;; background-size: cover-image; background-repeat: no-repeat; width: 105%; height: 500px; overflow: hidden; padding: 0; opacity: 0.9; } sta_scan)被定义为如下结构中的位域。声明这些标志的位置是否重要(就内存保存而言)?

search

2 个答案:

答案 0 :(得分:3)

,但并非总是如此。

检查此示例:

#include <stdio.h>
#include <string.h>

struct {
    char name[16];
    unsigned int sta_scan:1;
    int interval;
    unsigned int search:1;
} sta_all;

int main( ) {

   sta_all.interval = 4;
   printf( "Sizeof(sta_all) : %zu\n", sizeof(sta_all) );

   return 0;
}

输出:

  

Sizeof(sta_all):28

#include <stdio.h>
#include <string.h>

struct {
    char name[16];
    unsigned int sta_scan:1;
    unsigned int search:1;
    int interval;
} sta_all;

int main( ) {

   sta_all.interval = 4;
   printf( "Sizeof(sta_all) : %zu\n", sizeof(sta_all) );

   return 0;
}

输出:

  

Sizeof(sta_all):24

这是因为填充on my platform

顺便说一下,如果你真的非常渴望内存效率,并且你可以接受失去访问速度,那么你可以使用打包,如上面的链接所解释的那样。

注意:上面的示例确认了此Jonathan Leffler中提到的comment

  

每个位字段可能会分配与基本类型(unsigned int)一样多的空间,并将使用该存储单元中32个(16,64,...)位中的1个。如果您决定使用位字段,则应确保所有位字段都聚集在一起;它将最大限度地减少浪费的空间。 [...]。在结构的上下文中,编译器无法自由移动位域。

..与链接的答案完美和谐,因为当我们对位域进行聚类时,编译器必须添加更少char gap_{i}[3];,从而最小化struc的大小!

值得吗?

恕我直言......:)

答案 1 :(得分:1)

总的来说,是的。结构元素通常以某种方式对齐(通常是元素的大小,偶尔会更大),混合各种大小会导致大量填充。有办法缓解这个问题。通常,如果将所有相同大小的元素组合在一起,它们可能会在没有任何填充的情况下被打包。可以使用pragma来强制打包一个没有填充的结构,但是这会导致对struct成员的低效无法访问。