一文了解什么是字节对齐

1 什么是字节对齐?

字节对齐主要是针对结构体而言的,通常编译器会自动对其成员变量进行对齐,以提高数据存取的效率;

2 字节对齐的两种方式默认对齐方式、指定对齐方式;

(1)默认对齐方式内存分配满足以下三个条件:

结构体第一个成员的地址和结构体的首地址相同;结构体每个成员地址相对于结构体首地址的偏移量(offset)是该成员大小的整数倍,如果不是则编译器会在成员之间添加填充字节;结构体总的大小要是其成员中最大size的整数倍,如果不是编译器会在其末尾添加填充字节。如char是1字节,short是2字节,int是4字节...

(2)指定对齐方式使用以下方式声明:

代码语言:javascript复制//注:通过#pragma pack(n)改变C编译器的字节对齐方式

#pragma pack(4) //安装4字节的对齐方式

指定对齐方式内存分配满足以下几个条件:

结构体第一个成员的地址和结构体的首地址相同结构体每个成员的地址偏移需要满足:N大于等于该成员的大小,那么该成员的地址偏移需满足默认对齐方式(地址偏移是其成员大小的整数倍);N小于该成员的大小,那么该成员的地址偏移是N的整数倍。结构体总的大小需要时N的整数倍,如果不是需要在结构体的末尾进行填充。如果N大于结构体成员中最大成员的大小,则N不起作用,仍然按照默认方式对齐。注:在使用#pragma pack设定对齐方式一定要是2的整数幂,也就是(1,2,4,8,16,…),不然不起作用的,仍然按照默认方式对齐。

例1:结构体使用字节对齐为1

代码语言:javascript复制

// date:2022年 11月 08日 星期二 19:35:36 CST

// author: HeiBaiYe

// path: /mnt/hgfs/CD2206/02-c语言

#include

#pragma pack(1) //通过#pragma pack(n)改变C编译器的字节对齐方式 在C语言中,结构是一种复合数据类型

structs1{

char ch; // 1

int a; //4

double b; //8

char c1; //1

};

#pragma pack(1)

structs2{

char ch; //1

int a; //4

double b; //8

};

intmain()

{

printf("s1的大小:%ld\n ",sizeof(struct s1));

printf("s2的大小:%ld\n ",sizeof(struct s2));

return0;

}

结果:

s1的大小:14

s2的大小:13

例2:结构体使用默认字节对齐方式,m值

代码语言:javascript复制// date:2022年 11月 08日 星期二 19:35:36 CST

// author: HeiBaiYe

// path: /mnt/hgfs/CD2206/02-c语言

#include

structs1{

char ch; // 1

int a; //4

double b; //8

char c1; //1

};

structs2{

char ch; //1

int a; //4

double b; //8

};

intmain()

{

printf("s1的大小:%ld\n ",sizeof(struct s1));

printf("s2的大小:%ld\n ",sizeof(struct s2));

return0;

}

结果:

s1的大小:24

s1的大小:16

参考文章:https://blog.csdn.net/wdl20170204/article/details/109386825

作者:飞羚

《小驰行动派的知识星球》

————————————————


全民钱包:把安心藏进每一步,用细节筑牢你的金融安全墙
问1680数字代表什么意思