IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【C语言】-结构体内存对齐。附详细图解 -> 正文阅读

[C++知识库]【C语言】-结构体内存对齐。附详细图解


前言

这篇文章笔者总结了结构体内存对齐的内容,这部分内容非常重要,并且易错点。


1、结构体内存对齐的外在表现

先看代码:

struct S1
{
 	char c1;
	int i;
 	char c2;
};
printf("%d\n", sizeof(struct S1));
//练习2
struct S2
{
 	char c1;
 	char c2;
 	int i;
};
printf("%d\n", sizeof(struct S2));

这两段代码的运行结果是什么?都是6?
答案出乎意料:
在这里插入图片描述
分别是12、8
为什么会是这样的结果?
这就是笔者这篇博客要深入探讨的内容:结构体内存对齐

2、结构体对齐的基本规则

下面笔者给出原创超祥解图:
在这里插入图片描述
通过这张图,我们了解了结构体内存对齐的前三条规则,我们同理可以得到第二段代码的打印数为 8.与上述分析过程是一模一样的。
但是内存对齐不止三条规则。第四条规则为:

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

这里笔者就不给出第四条规则的详解了,相当于将嵌套的结构体当作一个变量,类似于上述变量开辟空间的过程。

3、为什么要结构体内存对齐?

这里笔者总结了两条原因:

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

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

第一条原因笔者不做过多赘述,具体意思如文字所描述。对于第二条原因,笔者再次通过画图加深你对第二条原因的理解。
在这里插入图片描述

所以总体来说,我们可以概括为:结构体内存对齐是为了用空间换取性能

4、一些关于内存对齐的小细节

1.当我们在设计结构体时,我们要让占用空间小的成员尽量集中在一起。

从而又能实现对齐又能不浪费空间。

2.我们可以通过#pragma pack来实现默认对齐数的修改

例如:

#include <stdio.h>
#pragma pack(8)//设置默认对齐数为8
struct S1
{
 char c1;
 int i;
 char c2;
};
#pragma pack()//取消设置的默认对齐数,还原为默认
#pragma pack(1)//设置默认对齐数为1
struct S2
{
 char c1;
 int i;
 char c2;
};
#pragma pack()//取消设置的默认对齐数,还原为默认
int main()
{
    //输出的结果是什么?
    printf("%d\n", sizeof(struct S1));
    printf("%d\n", sizeof(struct S2));
    return 0;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-10-22 20:56:54  更:2022-10-22 20:59:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 4:02:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码