字节对齐之C语言犄角旮旯的知识

目录

字节对齐

什么是字节对齐

对齐方式

n字节对齐

自然对齐

那么结构体的对齐方式


字节对齐

什么是字节对齐

        从内存访问的效率出发,CPU底层或者编译器一般会要求,所有的对象的地址按照某种方式来对齐。
        一般来说,就是要求对象的地址是n的倍数。

对齐方式

n字节对齐

对象的地址是n的倍数(n一般为2的x次幂)
 eq:
        4字节对齐:所有对象的地址必须为4的倍数。
        8字节对齐:所有对象的地址必须为8的倍数。
        16字节对齐:
                。。。
            
            GCC代码中:
                程序员可以指定对齐方式:
                    __attribute__((aligned(n))

自然对齐

编译器默认的一种对齐方式(32bits与64bits编译器会有不一样)。

32bits64bits
char1字节对齐1字节对齐
short2字节对齐2字节对齐
int4字节对齐4字节对齐
long4字节对齐8字节对齐
long long4字节对齐8字节对齐
any pointer 4字节对齐8字节对齐
double8字节对齐8字节对齐

对象的地址必须是对象长度的倍数,什么意思呢?
            举个栗子:
                sizeof(int) = 4;
                int a;
                &a :必须为4的倍数
                
                if &a不是4的倍数,说明a不是自然对齐。
                
                sizeof(short) = 2;
                short a;
                &a : 必须为2的倍数
                if &a不是2的倍数,说明a不是自然对齐
                
                sizeof(long) = 8;
                long b;
                &b:b的地址必须是8的倍数
                
                sizeof(char) = 1;
                char c;
                &c:c的地址必须是1 的倍数
            
每个变量(包括结构体中的成员变量)都会有一个默认的对齐方式:--》自然对齐

那么结构体的对齐方式

            (1)结构体变量按其最大的类型成员变量的对齐方式对齐
            (2)结构体的大小必须为其对齐方式的整数倍(一般都为向上取整)

举个例子:

struct test
{
    char a;    //a的对齐方式:一字节对齐
    int b;     //b对齐的方式:四字节对齐
    short c;   //c对齐的方式:2字节对齐
};

                struct test 按照b的对齐方式进行对齐:4字节对齐
                struct test 变量 (整个结构体)大小必须是4的整数倍。
                sizeof(struct test); ==>  12

再思考两个

struct finalPadShort
{
	short x;
	char n[3];
};  
sizeof(struct finalPad);    //6
struct MixedData
{
	char data1;
	short data2;
	int data3;
	char data4;
};
sizeof(struct finalPad);    //12

最后一个为什么是12呢,我们来看图,以下就是它的存储形式

地址低位地址高位
charshortshortXintintintintcharXXX

如图,第一个成员变量是char,占1字节,第二个成员变量是short,占2字节,这两个成员变量加起来没有超过int的4字节,可以放在一个4字节中,所以一共是3个4字节,

sizeof(struct finalPad) == 12。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勾栏听曲_0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值