文章目录
前言
一、自然对齐(默认对齐方式)
1.原理:
2.举例:
二、预处理指令
1.原理:
2.举例
三、编译器一种属性语法
1.原理
2.举例
总结
前言
C语言调试笔记,C语言中字节对齐的几种方式记录一下
字节对齐是指数据存储时按照一定的规则在内存中排列,使得数据的访问效率更高
一、自然对齐(默认对齐方式)
1.原理:
自然对齐是编译器默认的对齐方式。在这种方式下,数据类型按照其自身的长度进行对齐存储。
例如,char类型(通常为 1 字节)可以从任意地址开始存储,因为它的长度就是 1 字节;
short类型(通常为 2 字节)的存储地址是 2 的倍数;
int类型(通常为 4 字节)的存储地址是 4 的倍数;
double类型(通常为 8 字节)的存储地址是 8 的倍数等。
2.举例:
#include
struct NaturalAlignment {
char c; // 1字节,地址可以是任意位置
int i; // 4字节,会自动对齐到4的倍数地址
short s; // 2字节,因为前面的int已经是4字节对齐,所以这里也自然对齐
};
int main() {
struct NaturalAlignment na;
printf("Size of struct NaturalAlignment: %ld\n", sizeof(na));
// 输出结果通常为1 + (3 padding) + 4 + 2 = 10字节
// 其中3字节是为了让int能从4的倍数地址开始存储而填充的字节
return 0;
}
注意! 某些编译器可能执行结果是12,这跟32位和64位系统中机器字长有关。但是我们验证的是此种对齐方式
二、预处理指令
1.原理:
#pragma pack(n) 是一种预处理指令,用于指定结构体或联合体成员的对齐方式。
其中n表示对齐字节数,编译器会按照这个指定的字节数来对齐成员。
它会尽量按照不超过n字节的边界来对齐成员,但如果成员本身长度大于n,则按照成员自身长度对齐
2.举例
代码如下(示例):
#include
#pragma pack(1) // 指定按1字节对齐
struct PackedAlignment1 {
char c;
int i;
short s;
};
#pragma pack() // 恢复默认对齐方式
#pragma pack(2) // 指定按2字节对齐
struct PackedAlignment2 {
char c;
int i;
short s;
};
#pragma pack() // 恢复默认对齐方式
int main() {
struct PackedAlignment1 pa1;
struct PackedAlignment2 pa2;
printf("Size of struct PackedAlignment1: %ld\n", sizeof(pa1));
// 输出结果为1 + 4 + 2 = 7字节,因为按1字节对齐,没有填充字节
printf("Size of struct PackedAlignment2: %ld\n", sizeof(pa2));
// 输出结果为1 + (1 padding) + 4 + 2 = 8字节
// 因为按2字节对齐,char后填充1字节使int能从2的倍数地址开始存储
return 0;
}
三、编译器一种属性语法
1.原理
这是 GCC 编译器提供的一种属性语法,用于指定变量或类型的对齐字节数。
它主要用于对结构体、联合体或者变量强制指定对齐方式,n为对齐字节数。
当用于结构体时,整个结构体的大小会是n的倍数。
2.举例
#include
struct AlignedAttribute {
char c;
int i;
short s;
}__attribute__((aligned(4))); // 指定结构体按4字节对齐
int main() {
struct AlignedAttribute aa;
printf("Size of struct AlignedAttribute: %ld\n", sizeof(aa));
// 输出结果为4 + 4 + 4 = 12字节
// 因为按4字节对齐,char后填充3字节,short后填充2字节
// 使整个结构体大小是4的倍数
return 0;
}
总结
这些字节对齐方式在不同的场景下有不同的用途。在需要精确控制内存布局或者与硬件设备进行数据交互时,合理的字节对齐方式可以确保数据的正确读写和高效传输
- 传奇手游红名多久能恢复?如何快速恢复红名状态?传奇手游红名多久能恢复?如何快速恢复红名状态? 在传奇手游的世界里,红名是一个令人畏惧的状态。红名玩家在游戏中会受到其他玩家的攻...
- 电脑图片加文字,分享6种小白也能轻易使用的图片加文字方法生活中,无论是工作还是学习场景,我们都可能因为各种原因需要在图片上添加文字。有时候,这是为了提升信息的传达效果,使其更加清晰;...
- 天梭日历要怎么调才准(详细步骤教你轻松搞定)天梭维修中心分享:天梭是一家瑞士钟表品牌,其日历功能作为一个高端品牌的标志性功能,是钟表爱好者和收藏家所钟爱的。然而,有时候天...
- 襄阳市第四中学怎么样好不好?升学率教学质量如何?知识好像砂石下面的泉水,越掘得深泉水越清。有很多想要报考 襄阳市第四中学的同学好奇 襄阳市第四中学好不好,升学率教学质量如何?为...
- 如何一次打印多个 PDF 文件?你是不是有好多 PDF 文件要赶紧打印出来呀?要是一个一个打印,虽然能行,但太浪费时间啦。要是能一次打印多个 PDF 文件,节省时间和精力,...
- 40000 字、100 张配图,教你如何用 iPhone 拍出好照片 & 视频:iPhone 相机完全操作指南 2.0写在前面 之所以叫做《iPhone 相机完全操作指南 2.0》是因为在这之前,我已经写过一篇 比较详尽的 iPhone 相机操作指南。这篇文章目前在全网的...
- 網購衣服尺寸怎麼量?男女尺寸建議參考,網購衣服再也不怕不合在實體店面購買衣服的時候可以直接試穿來決定尺寸是否適合以及喜不喜歡這件衣服或褲子,除了實體店面,最多的就是在網路上網購衣服。在...
- QQ被盗怎么冻结QQ号?紧急冻结QQ号操作流程如今网络在带给我们精彩内容时,也隐藏了很多危险,有时QQ操作不当就会出现盗号情况,一般发现自己QQ被盗用了,减少账号损失最便捷方式,...
- 探索数字艺术创作世界的15款画画软件App推荐(为艺术家们带来的创作灵感和便利工具)在数字化时代,艺术创作已经不再局限于传统媒介。越来越多的艺术家转向使用画画软件App来表达自己的创意和想法。这些软件提供了丰富的绘...
- 不幸的解释解释◎ 不幸 bùxìng (1) [disaster;distress;misfortune;bad (ill) luck;sad;unfortunate] (2) 指死亡 然民之遭水旱疾疫而不幸者。——清·洪亮吉《治平篇》 来时太...