课外闲谈4.对齐数的概念

简介: 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字符;

什么地方要用到对齐数的概念呢?


只要涉及到多个数据的内存的存储方面,一般是都要讲对齐这个概念的,但是在目前为止,对齐这个概念注意凸显在结构体中。因为数组中都是同种类型的数据,所以并不会浪费空间。但是结构体中存储的是不同类型的数据,难免会浪费一些空间。


C语言之内存对齐数_微风-CSDN博客_c语言内存对齐

https://blog.csdn.net/qq_34328833/article/details/51352663?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163993041416780357221063%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=163993041416780357221063&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-51352663.pc_search_result_cache&utm_term=%E5%AF%B9%E9%BD%90%E6%95%B0&spm=1018.2226.3001.4187

 问题一:为什仫要内存对齐?


   我们知道的是计算机中最小的存储单位是字节(一个字节是八个比特位),当我们查找数据的时候可以一个字节一个字节的查找,但是这种查找方式存在缺陷:查找速度慢。如果不存在内存对齐,在实例三中,我们首先为结构体变量c分配一个字节,然后紧着我们为结构体变量c2分配一个字节,在最后我们为结构体整形变量i分配四个字节;如果我们一个字节一个字节查找元素的话,找c和c2当然很容易了,可是找i呢?我们知道内存为整形变量i分配了4个字节,我们要访问完整的i我们需要找到变量c2之后的四块存储空间,和我们刚开始定义的一样我们是一个字节一个字节找,此时指针需要移动三次才可以找到全部整形变量i的所有字节。是不是觉得很麻烦呢?如果有了内存对齐呢?我们可以四个字节四个字节的找,是不是就提高了我们查找的速率呢?那是肯定的啦!所谓的内存对齐就是牺牲了部分空间来换取效率的方法。


     问题二:内存对齐有哪些规则?


       1).结构体变量的首地址能够被其最宽基本类型成员的大小所整除,结构体的第一个成员永远放在零偏移处;

       2).结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字符;

       3). 结构体的总大小为结构体最宽基本类型成员大小和编译器缺省対界条件大小中比较小得那个值的整数倍,如有需要编译器会在最后一个成员之后加上填充字节;


      4).在这里我们是可以修改默认对齐数的,一般我们用 #progma pack(n)这个语句来设置默认对齐数, 在这个我设置的默认对齐数是n,读者可根据自己的需要自行设置对齐数;用#progma pack()来取消设置对齐数, 换句话说就是我们可以自己修改内存中的默认对齐数;


     通过上述几个规则大家是不是对内存对齐有了更深的理解呢?下面我就来画图理解上述三个类似的范例:


    20160513224117014.png


C语言之内存对齐数_微风-CSDN博客_c语言内存对齐

https://blog.csdn.net/qq_34328833/article/details/51352663?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163993041416780357221063%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=163993041416780357221063&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-51352663.pc_search_result_cache&utm_term=%E5%AF%B9%E9%BD%90%E6%95%B0&spm=1018.2226.3001.4187

#pragma 这是个预处理指令,可以修改默认对齐数


这下面两个分别是改了默认对齐数和没有改的。


48d06a612b8048ed8a7c8bb374c3b53c.png

cf6b06776d554e4fa05e672e235af934.png


改完之后记得要还原。


4540b653ac5947348fe8bb7208f4d33c.png


补:


offsetof函数,返回值为偏移量


size_t offsetof(类型名,成员名)


返回值为相对于结构体头部的偏移量。

目录
相关文章
|
4月前
|
监控 数据挖掘
IEC104初学者教程,第九章:计数量召唤流程详解
在IEC 60870-5-104(简称IEC104)协议中,计数量召唤(Counter Interrogation,简称CI)是一种特定的功能,用于获取远程终端设备(RTU)中的计数值。这些计数值通常是累计数据,如电能表的累计电量等。计数量召唤流程与总召唤类似,但有其独特的步骤和信息结构。以下是计数量召唤的基本流程:
54 4
IEC104初学者教程,第九章:计数量召唤流程详解
|
6月前
大学物理(上)-期末知识点结合习题复习(4)——质点运动学-动能定理 力做功 保守力与非保守力 势能 机械能守恒定律 完全弹性碰撞
大学物理(上)-期末知识点结合习题复习(4)——质点运动学-动能定理 力做功 保守力与非保守力 势能 机械能守恒定律 完全弹性碰撞
101 0
|
7月前
|
C语言
【C语言】“分⽀与循环第一章:开启创新之门,探索无尽可能性的第一篇章“2
【C语言】“分⽀与循环第一章:开启创新之门,探索无尽可能性的第一篇章“2
|
7月前
|
C语言
【C语言】“分⽀与循环第一章:开启创新之门,探索无尽可能性的第一篇章“1
【C语言】“分⽀与循环第一章:开启创新之门,探索无尽可能性的第一篇章“
|
前端开发 容器
🍊Flex布局最佳实践之骰子实战篇(面试高频考点,速来围观呀~)
🍊Flex布局最佳实践之骰子实战篇(面试高频考点,速来围观呀~)
656 6
🍊Flex布局最佳实践之骰子实战篇(面试高频考点,速来围观呀~)
|
存储 安全 Java
Java多线程基础——两万字详解
进程简单来说就是正在运行的程序,是可以通过双击执行的.exe文件,打开我们电脑的任务管理器,可以看到我们的电脑正在执行的进程,目前我们的电脑都是多进程模式。
123 0
Java多线程基础——两万字详解
|
安全 程序员 虚拟化
【Windows核心编程+第一个内核程序】爆肝120小时整理-80%程序员最欠缺的能力,一半以上研究生毕业了还不懂?理解各种深度技术的基本功
【Windows核心编程+第一个内核程序】爆肝120小时整理-80%程序员最欠缺的能力,一半以上研究生毕业了还不懂?理解各种深度技术的基本功
118 0
【Windows核心编程+第一个内核程序】爆肝120小时整理-80%程序员最欠缺的能力,一半以上研究生毕业了还不懂?理解各种深度技术的基本功
|
人工智能 大数据 程序员
DayDayUp:2019.12.31罗振宇2020年跨年演讲《时间的朋友》读后有感—思维决定一个人的上限,能力决定一个人的下限
DayDayUp:2019.12.31罗振宇2020年跨年演讲《时间的朋友》读后有感—思维决定一个人的上限,能力决定一个人的下限
DayDayUp:2019.12.31罗振宇2020年跨年演讲《时间的朋友》读后有感—思维决定一个人的上限,能力决定一个人的下限
|
算法
重温算法之三数之和
双指针的查找使用范围很广,也是必须掌握的一种解题方案,由上题比对我们也可以看到,在算法中要考虑到多种情况,如果遗漏掉某一些环节,就有可能发生异常,所以算法还是对思维严谨性要求比较高的,所谓失之毫厘差之千里。
126 0
重温算法之三数之和
|
存储 缓存 负载均衡
2w字 + 41张图带你参透并发编程!(二)
在计算机最早期的时候,没有操作系统,执行程序只需要一种方式,那就是从头到尾依次执行。任何资源都会为这个程序服务,在计算机使用某些资源时,其他资源就会空闲,就会存在 浪费资源 的情况。
2w字 + 41张图带你参透并发编程!(二)