鉴于有一些不相关的标志( .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
答案 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成员的低效无法访问。