C语言结构体占内存多少?

2025-03-19 22:52:39
推荐回答(5个)
回答(1):

C语言获取变量、数据类型内存占多少,使用sizeof运算符即可。


关于结构体所占的内存多少,一般还要考虑对齐的问题。只所以要进行数据对齐是因为编译器对结构的存储的特殊处理能提高CPU存储变量的速度,一般来说,32位的CPU内存以4字节对齐,64位的CPU的以8字节的对齐。一般可以使用#pragma pack()来指出对齐的字节数。比如下面的代码,在debug会显示结构体test的内存大小为28,如果生成release版则所占内存大小为32 。

#include 

#ifdef _DEBUG
#pragma pack(4)
struct test
{    
char x[13]; // 13
int d;        // 4    
double f;     // 8
}ss;
#else
#pragma pack(8)
struct test
{    
char x[13]; // 13
int d;        // 4    
double f;     // 8
}ss;
#endif

int main(void){  
 
printf("%d\n", sizeof(ss));  
    return 0;
}

回答(2):

为了寻址速度的原因,所以内存管理采取了地址对齐的方式,即因为结构体成员中有double类型,所以对齐采用8个字节,也就是说成员f占8字节,n占8字节,str占32字节。
上面是VC默认的情况,你可以自己进行设置,方式为:在结构体类型前加上编译预处理命令
#pragma pack(1)
即可以显示按字节对齐时该结构体类型所占内存字节数,具体你可以看一下下面的例子
#pragma pack(1)
struct data
{
char str[13]; // 30
int n; // 4
double f; // 8
};
#pragma pack() //恢复原有设置
struct data2
{
char str[13]; // 30
int n; // 4
double f; // 8
}ss;
int main(void){
struct data ST;
printf("%d %d\n", sizeof(ST),sizeof(ss));
return 0;
}

回答(3):

看结果你的编译器应该是默认8字节对齐的,你在开头加一句#pragma pack(4)强制4字节对齐,那就会是你预期的结果44了

结构体除了成员要对齐之外,结构体自身也要对齐,规则是:结构体的总大小必须是对齐系数(就是#pragma pack指定的字节数)和该结构体内最长的基本类型长度这二者之间较小值的整数倍.(很绕口是吧)

例子这个结构体最长的基本成员是double,长度是8,那么8字节对齐的话,8和8之间较小的是8,那结构体必须是8的整数倍,就是48了,4字节对齐的话4和8之间较小的是4,长度是4的倍数就是44了

回答(4):

因为存在内存对齐这一概念,所以得到48了

回答(5):

64位对齐的原因?你的操作系统和使用的编译器要说下。