当前位置:首页 > 内存 > 正文

C语言结构体占用空间内存大小解析

  • 内存
  • 2024-05-09 00:27:11
  • 9434

一、C语言数据内存空间问题这涉及到结构的对齐问题。
当不使用#pagrampop(n)时[其中n是对齐的字节数],默认是根据结构体中最大的字节成员进行对齐。
你的结构体中有一个double类型变量,8个字节,下面有一个指针变量,4个字节。由于8是最大的,所以按8字节对齐。所以你的结构可以理解为每8个字节一行,有多行来存储所有这些成员,即:
第一行:double(正好8个字节)
第二行:*(指针类型,仅左边占用4个字节,右边4个字节为空)
所以你的结构体一共占用了16个字节,虽然有效的12种字体,这也说明了一点:如果你的结构体的成员没有排列好如果设计不当,会造成内存浪费。
具体示例:
struct
{
doublea;
intb;
charc;
}
第一行:double(正好8个字节)
第二行:intchar(int类型只占用左边4个字节,右边还有4个字节足以容纳char类型的1个字节)
所以int和char共享一行8字节,所以总共还是16字节。
如果更改顺序:
struct
{
charc;
doublea;
intb;
}
第一行:char(实际只使用了1个字节,右侧7个空字体无法容纳第二个8字节的double类型)
第二行:double(由于double的8个字符)该节第一行放不下,所以只能放在第二行)
第三行:int(int占4个字节,右边有4个空字节)
所以这个结构占24字节。


二、c语言结构体共用体占内存字节Union:
sizeof(union
data1)的值为16。在编译器的默认设置下,由于该联合的最大基类型是double并占用8个字节,这个联盟从8开始调整。字符数组c2有9个字节;所以整个union应该占用9个字节;但根据对齐原则,实际分配给它的内存是16字节。
结构体:
struct
数据按8字节对齐,类型1的成员1分配8字节。s我c和原来的4;2、1、和10个字节。出于对齐的考虑;s分配4个字节;I分配2个字节,c分配2个字节。a原本是10个字节,考虑到对齐;由于整个结构体占用的存储空间必须是8的倍数,所以为其分配了16个字节。所以,结构数据为8+4+4+2+16=32字节。