c语言中的字节对齐
今天在学习c语言-结构体中,接触到了字节对齐,以下是对它的记录:
1、什么是字节对齐
从内存访问的效率出发, CPU底层或编译器一般会要求 ,所有对象的地址按某种方式对齐.
这种对齐,我们称之为"字节对齐"
为了提升内存的访问效率 ?
一般来说,字节地址就是要求对象的地址是 n 的倍数.
2、对齐方式
- n-字节对齐:- 对象地址和大小必须是 n 的倍数(n一般为2的x次幂)
如 :
4-字节对齐 : 所有对象的地址必须为4的倍数
8-字节对齐 : 所有对象的地址必须为8的倍数
16-字节对齐
......
- 自然对齐
编译器默认的一种对齐方式
对象的地址是对象的长度的倍数
在32bits x86机器,编译器:
Microsoft Visual C++
Borland/Code Gear(c++ builder)
Digital Mars(DMC)
GNU(gcc)
对 A char(1byte) 一字节对齐
a short(2bytes) 二字节对齐
an int(4bytes) 四字节对齐
a long(4bytes) 四字节对齐
a float(4bytes) 四字节对齐
a double(8bytes) 8字节对齐 On windows
4字节对齐 On linux(除非 -malign-double 8字节对齐)
a long long(8bytes) 4字节对齐
a long doulbe(10bytes) ?? 具体的对齐方式和编译器、系统有关
any pointer (4bytes) 4字节对齐
在64bits x86机器下,编译器
Microsoft Visual C++
Borland/Code Gear(c++ builder)
Digital Mars(DMC)
GNU(Gcc)
和32bits机子,只有以下不同:
A long (8 bytes) 8字节对齐.
A double (8 bytes) 8字节对齐.
A long long (8 bytes) 8字节对齐.
A long double (8 bytes with Visual C++, 8字节对齐在Visual C++
16 bytes with GCC, 16字节对齐在GCC
Any pointer (8 bytes) 8字节对齐.
3、结构体字节对齐
两个重要的要求
(1) 结构体变量按其最大的自然类型的成员变量的对齐方式对齐;
(2) 结构体的大小必须为其对齐方式的整数倍(一般向上取整).
//在32位的机器下
struct test
{
char a;//a按 1-字节对齐
int b;//b按 4-字节对齐
short c;//从按 2-字节对齐
};
struct test 按其最大成员(int b)的对齐方式来对齐 struct test 按4字节对齐.
//则这个结构体所占用的字节大小位sizeof(struct test)=12;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现