关于字节对齐

关于字节对齐

    • 前言
    • 意义
    • 自定义字节对齐
      • 存储空间
      • 内存读取效率
      • 平台适应性
    • 结论

前言

计算机中的内存空间大小是以字节(byte)为基本单位划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,而计算机并非逐字节大小读写内存,而是以2,4,或8的倍数的字节块来读写内存,则特定类型变量的时候经常需要在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,这就是对齐。

意义

实际上编程中,字节对齐的工作一般由编译器来自动实现了,我们可以不用刻意进行字节的对齐,但是如果对于系统性能有较高的要求时,字节对齐也是一个需要考虑的优化方向。下面基于结构体的字节对齐,以存储空间、内存读取效率、平台适应性三个方面进行介绍。

自定义字节对齐

#pragma pack (n)  //编译器将按照n个字节对齐。
....
#pragma pack() //取消自定义字节对齐方式。

存储空间

如下代码:

typedef struct
{char a;short b;int c;int d;}inputInfo;typedef struct
{char a;int b;short c;int d;
}inputInfo1;

以上两个结构体占用空间分别为12与16,可以看到虽然都是相同数据变量,不同的排列顺序会有不同的影响,这是编译器自动进行的字节填充造成的,因此合理安排变量位置可以节省不少的内存占用空间。

内存读取效率

在这里插入图片描述
由上图可知,在没有字节对齐的情况下,变量b是通过两次才被真正读取到,读取数据总共用了3次,而字节对齐后只用了2次,因此可以提高内存的读取效率,只不过是在牺牲内存空间的条件下。

平台适应性

由于不同平台在对存储空间的处理上有很大的不同,因此,同样的结构在不同平台的对齐方式有所不同,若没有字节对齐,轻则只是影响内存的执行效率,重则会造成程序出现错误。因此我们一般可以选择两种处理方法:

  1. 一字节对齐(内存占用最小,但执行效率最低)
  2. 根据平台要求自己定义字节填充(自己均衡内存空间占用与执行效率)

结论

  1. 一般要求结构体成员合理安排位置,其基本的原则就是把结构中的变量按照类型大小从小到大声明,以节省空间
  2. 跨平台数据结构可考虑1字节对齐,节省空间但影响访问效率
  3. 人为地进行字节填充,可以提高访问效率,但牺牲一定的内存空间
  4. 当需要最大程度的内存访问效率时,可以选择最大内存数据类型的倍数进行字节对齐

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427901.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++中的多线程

使用 std::thread 时需要包含 #include<thread> 头文件&#xff0c;定义了表示线程的类、用于互斥访问的类与方法等。 参考网址&#xff1a; https://blog.csdn.net/liuker888/article/details/46848905https://blog.csdn.net/fengbingchun/article/details/73393229成员…

C++ reverse memcpy

C reverse memcpy前言基于QT的测试样例结果前言 C 实现翻转memcpy 基于QT的测试样例 代码如下&#xff1a; #include <iostream> #include <QtCore/QCoreApplication> #include <QDebug>using namespace std;void *reversememcpy(void *out, const void *…

打架程序_学生打架不知道怎么处理?一般程序了解下,对你或许有帮助

很多新老师&#xff0c;对处理学生问题的步骤其实还不是很了解&#xff0c;一遇到学生问题就很苦恼&#xff0c;用的方法很多&#xff1a;或劝、或骂、或赏、或罚&#xff0c;但总是觉得不得要领。今天我想通过昨天我处理的一个实例&#xff0c;针对性的聊一聊这个问题。希望对…

提高应用程序稳定的小内容

用于提高应用程序稳定的小小要点要点内容&#xff1a;要点内容&#xff1a; 动态内存分配完后&#xff08;new&#xff09;&#xff0c;注意一个使用完的内存要对应一个delete&#xff0c;防止内存泄漏。当用QByteArray等数组结构来存储缓存时&#xff0c;缓存被读取后注意要清…

android旋转动画的两种实现方式

在android开发&#xff0c;我们会常常使用到旋转动画&#xff0c;普通情况下旋转动画有两种实现方式&#xff0c;一种是直接通过java代码去实现&#xff0c;第二种是通过配置文件实现动画。以下是两种动画的基本是用法&#xff1a; 纯Java代码实现&#xff1a; //创建旋转动画 …

jsp中设置自动换行_办公技巧—Word中如何设置自动生成序号

我们经常会用到Word来编辑文档&#xff0c;经常需要在文档中插入各种序号。如果一个个手动输入这些序列号&#xff0c;会降低我们的工作效率。那么&#xff0c;这种情况下&#xff0c;我们该怎么办呢&#xff1f;今天&#xff0c;小编就教各位Word中设置自动生成序号的小技巧&a…

js实现table合并相同列单元格

/** * Created with JetBrains WebStorm. * User: Johnny * Date: 18-3-26 * Time: 下午4:48 * Table td 相同值合并行 要求&#xff1a; * 1.table 必须包含tbody&#xff0c;tbody为数据主休 * 2.table 添加 id"kbdatas" * 调用说明: * $(function(){ * mergeRowSp…

mongodb如何根据字段(数组类型)的长度排序_大数据存储技术选型(七)——MongoDB设计模式及索引优化...

关系数据库的时代关系数据库的设计理念假设你有一台车&#xff0c;你需要给它存起来&#xff0c;给它找个停车位。传统数据库的存储方式就相当于&#xff0c;把这个车的所有零件拆下来&#xff0c;放在存放对应零件的盒子里&#xff0c;需要用的时候&#xff0c;再把他们取出来…

boot返回码规范 spring_sprigboot-new-coding-standards

sprigboot-new-coding-standards介绍SpringBoot脚手架&#xff0c;遵守严格的代码规范。规范详细说明1.遵循标准RESTful API2.异常采用枚举进行封装(业务内部异常往上抛&#xff0c;返回客户端需要将对应的异常转换为具体的状态的&#xff0c;这里介绍Spring提供的全局异常处理…

第四周读书笔记《构建之法》

第四周读书笔记《构建之法》 第四周读书笔记《构建之法》 沈三景 PB15061249 软件工程 读书笔记 前言 本周接着读了构建之法&#xff08;上周读了《程序员的修炼之道》&#xff09;的第六、七两个章节。 第六章 敏捷流程 敏捷流程是一系列价值观方法论的集合&#xff0c;它要求…

幼小衔接语言教案上c册_关于幼小衔接,这里有你最想要的解答

相信很多家长都会发现&#xff0c;在孩子即将步入小学的前一年或者半年左右&#xff0c;身边同龄的孩子有一部分会放弃大班的学习&#xff0c;转而去幼小衔接班了。就算平时再佛系的妈妈&#xff0c;内心也会焦虑&#xff0c;产生疑问&#xff1a;到底要不要上幼小衔接班&#…

每日一题20180330-Linux

一、问题 1.1 统计/var/log/下所有文件个数 1.2 查找出/var/log目录下面修改时间是7天以前&#xff0c;大小在50k到2M之间&#xff0c;并以.log结尾的文件把这些文件复制到/data目录中 1.3 设置一条Iptables规则&#xff0c;允许192.168.10.0段访问873端口&#xff1f; 二、答案…

前台文件_欧木瑾怎么定制办公前台?

前台是一个反映公司整体形象的地方。这是给客户和商业伙伴留下印象的第一个地方。因此&#xff0c;芜湖绿木家具有限公司欧木瑾小编说公司的前台装修不能马虎。前台的设计风格与材料的使用有很大关系。从细节上看&#xff0c;这是材料的精美运用。这里是如何设计一个好的前台。…

常用的魔术方法

__construct() 实例化类时自动调用。__destruct() 类对象使用结束时自动调用。__set() 在给未定义的属性赋值的时候调用。__get() 调用未定义的属性时候调用。__isset() 使用isset()或empty()函数时候会调用。__unset() 使用unset()时候会调用。__sleep() 使用serialize序列化时…

单纯形法只有两个约束条件_10分钟掌握对偶单纯形法

只听名字的话会感觉对偶单纯形法和对偶问题关系很大&#xff0c;其实不然(想要了解对偶问题的话可以看我之前的文章)。对偶单纯形法在我看来和大M法以及两阶段法很像&#xff0c;都是用来补充纯粹的单纯形法无法解决特殊问题的缺陷。而且对偶单纯形法更加“强大”&#xff0c;因…

linix防火墙设置之顺序设置问题 -- 解决防火墙规则顺序和插入规则到指定序号的问题...

转载于百度经验&#xff1a;https://jingyan.baidu.com/article/ae97a646ce58c2bbfd461d90.html 无论是硬件防火墙还是软件防火墙都会有一个规则序列的问题&#xff0c;规则顺序会影响到规则的生效情况&#xff0c;所以这个必须得注意&#xff0c;下面小编与大家分享一下如何注…

fir fpga 不同截止频率_学习FPGA将来的出路在哪里?

1. 在国内 FPGA 最大的应用市场还是通信类&#xff0c;几大厂商的重要收入来源还是华为、中兴、阿朗等&#xff0c;基本上可以直接呼叫原厂 AE 上门支持那种。算法类&#xff08;如各种 FIR&#xff09;、接口类&#xff08;如 CPRI、Interlaken、XAUI、PCIE、GE、SRIO 等&…

grep 正则表达

常见的 grep 正则表达参数 -c # 显示匹配到得行的数目&#xff0c;不显示内容 -h # 不显示文件名 -i # 忽略大小写 -l # 只列出匹配行所在文件的文件名 -n # 在每一行中加上相对行号 -s # 无声操作只显示报错&#xff0c;检查退出状态 -v # 反向查找 -e …

office 打开wps乱_为什么word文档用wps打开,格式乱了

出现乱码的原因如下&#xff1a;1. 版本不同&#xff0c;往往高版本能打开低版本的&#xff0c;但低版本打开高版本就会出错2. 文档损坏 解决办法是直接重新下载该文件&#xff0c;再次打开&#xff0c;如果还是乱码则可以排除这种可能&#xff1b;3. 低版本打开高版本&#x…

Ubuntu安装完后设置root密码

安装完Ubuntu 14.04后默认是没有主动设置root密码的&#xff0c;也就无法进入根用户。 相关阅读&#xff1a; Ubuntu 14.04 下载、安装、配置 整理汇总 页面 http://www.linuxidc.com/Linux/2014-04/100370.htm Windows 7下硬盘安装Ubuntu 14.04永久更新地址&#xff1a; http:…