关于结构体内存的对齐方式

        在C语言中,我们经常使用结构体(struct) 。对于结构体的描述,很多C语言的书中会提到结构体所占用的内存与其内的成员在结构体中的声明顺序有关,但是很少有书讲述了结构体占用的内存与结构体的成员声明顺序如何相关的(即结构体在内存中的对齐方式是怎么样的)。
       首先我们来看以下代码的输出结果:
#include < stdio.h >
#pragma  pack(2)
struct  T {
    
char i;
    
int d;
    
char ii;
 }
;
#pragma  pack()
int  main( int  argc, char   *  argv[])
{
    printf(
"%d ",sizeof(struct T));
    
return 0;
}
    最后输出的结果为:8。
    语句 #pragma  pack(2)的作用是定义了结构体的对齐方式,在这里指定了是按规2字节对齐,在这里我们用PPB来表示该指令指定的对齐字节数,上述代码中的PPB=2。
    结构体的内存对齐规则是:
  1. 每个成员分别按自己的对齐字节数和PPB(指定的对齐字节数)两个字节数最小的那个对齐,并能最小化长度。
  2. 复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度。
  3. 结构体对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐。
    我们按上面的规则来分析上述代码的输出结果为什么是8,分析如下:
  • 变量i默认为1字节,PB=2,所以i按1字节对齐。
  • 变量d默认为4字节(在32位机器中int为4字节),PB=2,所以d按2字节对齐。
  • 变量ii默认为1字节,PB=2,所以ii按1字节对齐。
  • 此时结构体的计算出的字节数为7个字节。最后按规则3,结构体对齐后的字节数为8。可以用图1来示意结构体的字节对齐情况。
   
                                     █ █ █ █ █
    
        █ 变量占用的内存 变量d占用的内存 变量ii点用的内存 为保证内存对齐填补的内存

图1 结构体内存对齐示意图
    对下代码中在一个结构体中声了一个结构体变量。
#include < stdio.h >
#pragma  pack(2)
struct  T {
    
char i;
    
int d;
    
char ii;
}
;
#pragma  pack()

struct  TT {
    
char c;
    
struct T t;
    
long long d;
}
;

int  main( int  argc, char   *  argv[])
{
    printf(
"%d ",sizeof(struct TT));
    
return 0;
}
这段代码输出的结果为:24。结构体T占用8字节,那么在结构体TT中它是按什么方式对齐的呢,按照规则2进行对齐。long long 类型为8个字节。所以结构体的内存对齐方式为:1***,1***,1111,1****,11111111。
 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值