当前位置:主页 > c/c++教程 > C语言结构体内存对齐

C语言程序中结构体的内存对齐详解

发布:2023-03-10 14:00:01 59


给寻找编程代码教程的朋友们精选了相关的编程文章,网友容溪澈根据主题投稿了本篇教程内容,涉及到C语言结构体内存对齐、C语言、内存对齐、C语言、结构体、C语言结构体内存对齐相关内容,已被982网友关注,内容中涉及的知识点可以在下方直接下载获取。

C语言结构体内存对齐

一、为什么存在内存对齐

1.平台原因(移植原因): 不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。

2. 性能原因: 数据结构(尤其是栈)应该尽可能地在自然边界上对齐。 原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。

总的来说结构体的内存对齐是拿空间来换取时间的做法。

二、结构体的内存对齐四规则

默认情况:默认的对齐值 8字节

1.基本数据类型有一个对齐值

2.自定义类型有一个对齐值 = 内部成员类型的最大值

3.程序的指定对齐值:#pragma pack(n) n == 2的幂次方 n可以等于2 4 8 16 …

4.程序的有效对齐值:程序的指定对齐值和数据类型对齐值得较小值

三、举例

例1

typedef struct Test //8
{
	char a;     //1 + 7
	double b;   //8 
	int c;      //4 + 4
}Test;
void main()
{
	Test t;
	printf("Test size = %d", sizeof(Test));
}

分析:

char类型占一个字节,double类型占八个字节,int占四个字节;根据其对齐规则,内部成员类型的最大值为double(8个字节),所以char类型要补齐另外的七个字节,加上int的四个字节,一共是:1+7+8+4 = 20,此时20不是8的倍数,因此int要补四个字节。

结果:

例2

typedef struct Test //8
{
	char a;     //1 + 3
	int c;      //4
	double b;   //8
}Test;
void main()
{
	Test t;
	printf("Test size = %d", sizeof(Test));

}

分析同上

结果:

例3

typedef struct Test
{
	short a; //2 + 6
	struct
	{
		int b;   //4 + 4
		double c;//8
		char d;  //1 + 7
	};
	int e;    //4 + 4
}Test;
void main()
{
	Test t;
	printf("Test size = %d", sizeof(Test));
}

结果:

例4 程序中有指定对齐值时

#pragma pack(2)
typedef struct Test
{
	short a; //2
	struct
	{
		int b;   //4
		double c;//8
		char d;  //1 + 1
	};//14
	int e;    //4
}Test;
void main()
{
	Test t;
	printf("Test size = %d", sizeof(Test));
}

结果:

以上就是C语言程序中结构体的内存对齐详解的详细内容,更多关于C语言结构体内存对齐的资料请关注码农之家其它相关文章!


参考资料

相关文章

  • VScode上配置 c语言环境的图文教程

    发布:2022-04-16

    这篇文章主要介绍了配置VScode c语言环境,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下


  • Lua和C/C++互相调用实例分析

    发布:2022-06-23

    给网友们整理关于C++的教程,今天小编就为大家分享一篇关于Lua和C/C++互相调用实例分析,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧


  • 用C语言求解第N项斐波那契数列问题

    发布:2023-03-13

    这篇文章主要介绍了用C语言求解第N项斐波那契数列问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教


  • 关于python和c语言学哪个好

    发布:2020-03-14

    现在很多外国的初学者都使用python作为编程语言,主要是python见效快,并且可以使用高级端口,c语言是比较低层的,一般不建议学习,学习起来也是比较枯燥。


  • C语言实现成绩统计示例

    发布:2023-03-12

    这篇文章主要介绍了C语言实现成绩统计示例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教


  • C语言如何求整数的位数及各位数字之和

    发布:2023-03-11

    这篇文章主要介绍了C语言如何求整数的位数及各位数字之和,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教


  • C语言汇编分析传递结构体指针比传递结构体变量高效的深层原因

    发布:2023-03-05

    本文章使用的工具是vs2010,本篇文章主要讲解结构体指针作为参数传递与结构体变量作为参数传递的对比,不谈值传递与址传递的概念


  • 详解C语言随机数设置的三种方式(保姆级教程)

    发布:2023-03-09

    本篇文章将为大家介绍在C语言中设置随机数的三大方法的使用,文中的示例代码讲解详细,对我们学习C语言有一定的帮助,需要的可以参考一下


网友讨论