C语言中结构体的内存对齐规则讲解

 更新时间:2022年05月06日 14:46:41   作者:利刃Cc  
C 数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型,它允许你存储不同类型的数据项,本篇让我们来了解C 的结构体内存对齐

1.结构体的内存对齐规则

1.第一个成员在与结构体变量偏移量为0的地址处。

2.其他成员变量都放在对齐数(成员的大小和默认对齐数的较小值)的整数倍的地址处。

对齐数=编译器默认的一个对齐数与该成员大小的较小值。(VS中默认的对齐数是8)

3.结构体总大小为最大对齐数(每个成员变量都有一个对齐数 )的整数倍。

4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

2.例子

1、例一

2、例二

3.为什么存在内存对齐

参考了大部分资料,大部分都这么说:

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

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

总的来说:

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

既然这样,那在设计结构体的时候,我们既要满足对齐,又要节省空间,如何做到:让占用空间小的成员尽量集中在一起。 如:

#include<stdio.h>
struct S1
{
	char c1;
	int i;
	char c2;
}
struct S2//优化后
{
	char c1;
	char c2;
	int i;
}

4.如何修改默认对齐数

我们见过了 #pragma这个预处理指令,这里我们再次使用,可以改变我们的默认对齐数

#include<stdio.h>
#pragma pack(8)//设置默认对齐数为8
struct S1
{
	char c1;
	char c2;
	int i;
}
#pragma pack()//取消设置的默认对齐数,还原为默认值
#pragma pack(1)//设置默认对齐数为1
struct S2
{
	char c1;
	char c2;
	int i;
}

到此这篇关于C语言中结构体的内存对齐规则讲解的文章就介绍到这了,更多相关C语言内存对齐内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • QT中QStringListModel类的应用介绍

    QT中QStringListModel类的应用介绍

    QStringListModel是最简单的模型类,具备向视图提供字符串数据的能力,本文主要介绍了QT中QStringListModel类的应用介绍,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • 显示任何进程加载的DLL文件的代码

    显示任何进程加载的DLL文件的代码

    c语言实现的显示任何进程加载的DLL,方便开发软件的朋友
    2013-05-05
  • 基于getline()函数的深入理解

    基于getline()函数的深入理解

    本篇文章是对getline()函数的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • operator new在C++中的各种写法总结

    operator new在C++中的各种写法总结

    这篇文章并不是一个综合的手册,而是一个C++中各种内存分配方法的概述。它面向已经很熟悉C++语言的读者
    2013-09-09
  • C语言直接插入排序算法介绍

    C语言直接插入排序算法介绍

    大家好,本篇文章主要讲的是C语言直接插入排序算法介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • c语言阶乘之和问题示例详解

    c语言阶乘之和问题示例详解

    这篇文章主要给大家介绍了关于c语言阶乘之和问题的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用c语言具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • C语言如何写类实现教程示例

    C语言如何写类实现教程示例

    这篇文章主要为大家介绍了C语言如何写类的实现教程示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • c++矩阵计算性能对比:Eigen和GPU解读

    c++矩阵计算性能对比:Eigen和GPU解读

    这篇文章主要介绍了c++矩阵计算性能对比:Eigen和GPU解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • C语言实现走迷宫

    C语言实现走迷宫

    这篇文章主要为大家详细介绍了C语言实现走迷宫,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • Qt数据库应用之通用数据库同步

    Qt数据库应用之通用数据库同步

    数据库同步的主要功能是将本地的数据库记录同步到远程的数据库。本文将利用Qt实现通用数据库同步功能,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-03-03

最新评论