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;
posted @   风恬月淡时  阅读(118)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
点击右上角即可分享
微信分享提示