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

 更新时间:2022年11月07日 08:48:15   作者:Fug_Lee  
这篇文章主要为大家详细介绍了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语言结构体内存对齐的资料请关注脚本之家其它相关文章!

相关文章

  • C++编写的WebSocket服务端客户端实现示例代码

    C++编写的WebSocket服务端客户端实现示例代码

    本文主要介绍了C++编写的WebSocket服务端客户端实现示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • 一波C语言字符数组实用技巧集锦

    一波C语言字符数组实用技巧集锦

    这篇文章主要介绍了一波C语言字符数组实用技巧集锦,包括许多字符的转换与提取等基本操作示例,需要的朋友可以参考下
    2016-04-04
  • C++实现高校教室管理系统

    C++实现高校教室管理系统

    这篇文章主要为大家详细介绍了C++实现高校教室管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C语言位图算法详解

    C语言位图算法详解

    这篇文章主要介绍了C语言实现的位图算法,主要包括了位图算法的定义与应用,对于C程序算法设计的学习有一定的借鉴价值,需要的朋友可以参考下
    2014-09-09
  • 详解DAG上的DP

    详解DAG上的DP

    DAG:有向无环图。DAG是学习动态规划的基础,很多问题都可以直接转化为DAG上的最长路、最短路或路径计数问题。本文将详细介绍DAG上的DP。
    2021-05-05
  • C语言中((type *)0) 和(type *0)区别小结

    C语言中((type *)0) 和(type *0)区别小结

    ((type *)0) 和 (type *0) 在 C 和 C++ 中有不同的含义和用途,本文主要介绍了C语言中((type *)0) 和(type *0)区别,具有一定的参考价值,感兴趣的可以了解一下
    2024-08-08
  • Ubuntu中使用VS Code与安装C/C++插件的教程详解

    Ubuntu中使用VS Code与安装C/C++插件的教程详解

    这篇文章主要介绍了Ubuntu中使用VS Code与安装C/C++插件的教程详解,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • C语言实现返回字符串函数的四种方法

    C语言实现返回字符串函数的四种方法

    在C语言中实现函数返回字符串,首先要确定函数返回的字符串地址的来源,一般分为四种方式,下面这篇文章就给大家通过示例代码详细介绍这几种方法,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-12-12
  • 解析如何在C语言中调用shell命令的实现方法

    解析如何在C语言中调用shell命令的实现方法

    本篇文章是对如何在C语言中调用shell命令的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • c语言socket多线程编程限制客户端连接数

    c语言socket多线程编程限制客户端连接数

    这篇文章主要介绍了c语言socket多线程编程,可以限制客户端连接数,大家参考使用吧
    2013-12-12

最新评论