Sou*_*abh 2 c memory-management
我在C语言中定义了2个结构,包含2个int和1个char.当我打印它们的大小时,它给出的结果我无法证明.这是我的代码:
#include<stdio.h>
struct sample
{
int a:6;
int b:12;
char s;
} st;
struct name
{
int a:28;
int b:12;
char ch;
} st1;
int main()
{
int i=sizeof(st);
printf("st : %d\n\n",i);
i=sizeof(st1);
printf("st1 : %d\n\n",i);
}
Run Code Online (Sandbox Code Playgroud)
输出是:
st : 4
st1 : 8
Run Code Online (Sandbox Code Playgroud)
st的大小是4字节,st1是8字节?
我发现了类似的问题,但我得到的价值仍然不合理.根据这个问题,我的结构st应该占用3个字节,st1应该占用6个字节.
典型的编译器将根据struct成员中最严格的对齐要求来确定结构对齐要求.通常将位字段视为该过程中的普通字段.
这意味着,由于您的第一个结构包含一个类型的成员int
(显然,对齐要求为4),整个结构的对齐要求为4,其大小始终可以被4整除.4是它的最小大小可能有.由于您只使用了18位的位域(至少3个字节),编译器设法将所有内容打包成4个字节.但它不能使它小于4.
(注意,顺便说一下,只需通过计算所需的位数就可以得到总数为26.你在地球上的预期如何适应3个字节,甚至忽略任何对齐注意事项,对我来说还不清楚.)
在您的第二个结构中,您使用40位作为位字段(已涉及5个字节).现在编译器无法将所有内容打包成4个字节,因此它使用8个字节.同样,结构大小需要可被4整除,这意味着如果4不够,则下一个最小大小为8.
如果要覆盖该对齐行为,则必须使用特定于编译器的功能强制将1字节对齐强制所有数据类型(#pragma pack
等).这样您就可以减小第二个结构的大小.但是您现在观察到的是默认对齐设置下的完美预期.