内存对齐

2023-10-31

最近为了找工作,狂补了很多基础知识。自以为掌握的不错了,但是真正笔试、面试的时候才发现不懂的知识真得还很多。对很多知识点的掌握和理解都还停留在表层。

今天总结一下关于字节对齐的知识。

字节对齐在这个找工作季算是被考烂了,笔试考多少次不记得了,面试中被问到的有腾讯、讯飞、先锋商泰等,各家的问的方式不同,但是终究都是考你是否真正掌握了内存对齐。

这一部分从网上抄来的。

一、内存对齐的概述

对于大部分程序员来说,“内存对齐”对他们来说都应该是“透明的”。“内存对齐”应该是编译器的“管辖范围”。编译器为程序中的每个“数据单元”安排在适当的位置上。但是C语言的一个特点就是太灵活,太强大,它允许你干预“内存对齐”。如果你想了解更加底层的秘密,“内存对齐”对你就不应该再透明了。

二、内存对齐的原因

1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
2、性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。

三、对齐的规则

每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。
规则:
1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
3、结合1、2可推断:当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果


字节对齐不仅仅是便于CPU的快速访问,同时也可以有效地节省存储空间。

对于32位机器而言,4字节对齐能够使CPU访问速度提高。比如说一个long类型的变量,如果跨越了4字节边界存储,比如2字节对齐,那么CPU要读两次,这样效率就低了。

所以字节对齐要考虑处理器类型,另外还要考虑编译器类型(vc,GNU gcc默认是4字节对齐)。

在缺省情况下,C编译器为每个变量或是数据单元按其自然对齐条件分配空间。但是可以通过下列方法改变缺省的对其条件:

1、使用伪指令

       #pragma pack(n) //按照n个字节对齐

       ....

       #pragma pack()

       2、

       ._attribute((aligned(n))) // 让所有的结构成员对齐在n字节自然边界上。如果结构中的成员的长度大于n,则按照最大成员的长度来对齐

      ...

      ._attribute_((packed))


四、举例说明

struct AA {

float a; 
char b;
short c;
int *d;
};

1、1字节对齐

#pragma pack(1)

struct AA {

float a; 
char b;
short c;
int *d;
};

#pragma pack()

sizeof(AA) = 11;

内存分布为:

1,1,1,1,1,1,1,1,1,1,1


2、2字节对齐

#pragma pack(2)

struct AA {

float a; 
char b;
short c;
int *d;
};

#pragma pack()


sizeof(AA) = 12;

1,1,

1,1,

1,*,

1,1,

1,1,

1,1


3、4字节对齐

#pragma pack(4)

struct AA {

float a; 
char b;
short c;
int *d;
};

#pragma pack()


sizeof(AA) = 12;

1,1,1,1,

1,*,1,1,

1,1,1,1


4、8字节对齐

#pragma pack(8)

struct AA {

float a; 
char b;
short c;
int *d;
};

#pragma pack()


sizeof(AA) = 12;

5、16字节对齐

#pragma pack(16)

struct AA {

float a; 
char b;
short c;
int *d;
};

#pragma pack()


sizeof(AA) = 12;


8字节和16字节对齐试验证明了"规则"的第3点:"当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果"。







本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

内存对齐 的相关文章

  • mysql 列名映射_[Mybatis] Mybatis处理列名->字段名映射(二) - AS用法 & ResultMap

    前言 考虑到在Select时使用AS和方案一其实没什么差别 在介绍ResultMap之前 顺便带过一下 方案二 Select AS 当我们的数据库列名和对象字段之间不是驼峰式命名的关系 我们可以在Select时使用AS 使得列名和对象名匹配
  • BTY Ecosystem DNS‘s Ideas of DeSoc

    In May 2022 Ethereum founder Vitalik Buterin economist Glen Weyl and Flashbots researcher Puja Ohlhaver jointly released
  • vue前端上传文件到COS

    1 main js中 COS相关的 Vue prototype loadi https images 1254950508 cos ap guangzhou myqcloud com a 1588390454918 loading gif
  • 计算机网络重点知识解析(1)

    总结一下计算机网络知识 文章目录 OSI七层网络协议 TCP IP协议模型 TCP协议 UDP协议 TCP和UDP协议的区别 RTT和RTO TCP的滑动窗口 TCP 拥塞控制 OSI七层网络协议 先来一张网络协议图 简单解释一下各个协议
  • 64位和32位相比优势是什么(一)

    前置知识 程序是如何执行的 一道常规的面试题 相比 32 位 64 位的优势是什么 面试官考察这种类型的问题 主要是想看求职者是否有扎实的计算机基础 同时想知道求职者在工作中是否充满好奇 会主动学习 寻根问底 毕竟 32 64 位是经常出现

随机推荐

  • [MATLAB]学习笔记

    目录 第一章 Matlab基础 1 1 Matlab介绍 1 2 界面使用 1 3 运算基础 1 4 数据基础 1 5 矩阵基础 第一章 Matlab基础 1 1 Matlab介绍 一 最新版本 MathWorks MATLAB R2021
  • Python和Java二选一该学啥?

    Java这种跨平台 可面向对象的编程语言完美解释了它不仅仅只是一种语言 而且自身很强大是一种开发平台 第一 学习过的大家可能都知道它的优势和特性有哪些 比如说它简单性 面向对象 分布式 解释型 可靠 安全 平台无关 可移植 高性能 多线程
  • 分享Visual Studio 2019专业版、企业版密匙

    官网下载地址 https visualstudio microsoft com zh hans downloads 点击进入 Professional产品密钥 NYWVH HT4XC R2WYW 9Y3CM X4V3Y Enterprise
  • 零基础初学前端—新建项目

    对于一个没有基础的新手来说 如何使用 vscode 新建一个前端项目 写一些html页面 并能进行运行 需要吐下几个步骤 新建一个文件夹 在文件夹里新建一个文件 命名为 xxx html 例如 index html 打开 vscode Fi
  • 【Windows】Windows下载使用wget命令

    文章目录 一 前言 介绍 二 安装步骤 2 1 下载 wget 压缩包 2 2 解压到指定的位置 2 3 检查是否安装成功 2 4 是否可以正常下载 一 前言 介绍 wget 是 linux 一个下载文件的工具 可以下载一些软件或从远程服务
  • centos7常用工具包安装

    1 nano yum install y nano 2 wget yum install y wget
  • MySQL的“插入”/“删除+插入”操作——REPLACE

    问题及背景 有一个数据表Table 主键为YYYY MM DD 年 月 日 形式的字符串 存储着本日某事件的信息 该信息每隔若干小时 会根据最新数据重新计算该信息 如果Table中已存在本日记录 需要对其进行 UPDATE 或 DELATE
  • 模型化公务员能力

    1 搜集信息 现象 在较大的行政管理对象中 信息失真是普遍现象 误区 地方统计上报的数据 只要各级管理人员认真负责 严格核实 怎么会有错误 对策 建立及时 真实 全面 立体的信息搜集和分析机制 2 办理公文 现象 领导的批示和交办的事项 往
  • Java System.arraycopy()方法示例

    Java System arraycopy is a native static method to copy elements from the source array to the destination array Java Sys
  • SQLserver 2008数据库迁移 - 导出 方法二 备份法

    前言 由于更换服务器 所以需要对数据库进行备份 到新服务器还原 收到数据库迁移的命令 登上服务器一看 一脸懵B SQLServer 2008完全没用过 于是开始查资料 各种百度 CSDN一顿查 方法一 保存脚本法 点此链接了解详情 方法二
  • keil报错:Symbol set_value multiply define和 incomplete type is not allowed和error:  #65: expected a “;“

    一个是重复定义 一个是不完整类型 一个是缺一个 第一个 重复定义 一般最多的就是两个文件中的变量定义重复而报错 一般这种改一下名就差不多了 而另一种就比较难看出来了 比如 定义一个结构体在sys h的文件中 并在文件中进行了定义和初始化 然
  • Formality流程

    Formality流程 前言 一 formality是什么 二 使用步骤 0 打开formality的gui界面 1 导入svf文件 2 读入verilog文件 3 读入网表文件 4 setup 5 match and verify 6 注
  • 安装 Media Player 11验证最简单的解决方案

    MS说打补丁 我就让它打 结果给我升到了11 还要验证 不爽 搞了半天 最后找到解决方案 好简单将C Program Files Windows Media Player LegitLibM dll改名为legitlib dll 打开Med
  • python网络爬虫模块

    re模块 想在python中使用正则表达式 可以使用re模块来辅助筛选 1 findall 查找数据中所有符合条件的数值 最后的结果以列表形式输出 贪婪匹配 import re res re findall l hello l l 2 fi
  • JavaEE学习 day09

    今天 继续学习了JavaEE 继续做SSM图书管理系统项目 SSM图书管理系统 修改用户 显示修改数据 SSM图书管理系统 修改用户 userid隐藏域 SSM图书管理系统 修改用户 与新增共用一个方法 SSM图书管理系统 删除用户 总结一
  • Python 批量处理PNG、JPG图片 去白边

    每次写论文用seaborn画出来的图白边都很大并且没法调 每次都用PS软件去白边很麻烦 索性写了个脚本 在不改变图片像素密度 尺寸变了 相当于切割 的情况下 批量去掉图片白边 参考了部分网上的程序 自己写了个简单的脚本 放到一个Python
  • python中isalpha的用法_Python string isalpha()用法及代码示例

    在Python中 isalpha 是用于字符串处理的内置方法 如果字符串中的所有字符都是字母 则isalpha 方法返回 True 否则 返回 False 此函数用于检查参数是否包含任何字母字符 例如 ABCDEFGHIJKLMNOPQRS
  • jd抢购工具_Python爬虫教程,京东自动登录,在线抢购商品

    京东抢购 Python爬虫 自动录京东网站 查询商品库存 价格 显示购物车详情等 可以指定抢购商品 自动购买下单 然后手动去京东付款就行 chang log 2017 03 30 实现二维码扫码登陆 2017 06 27 Golang版JD
  • STM32定时器及中断简单程序

    STM32定时器及中断简单 main stm32f103c8t6有3个普通1个高级定时器 每次进入中断服务程序间隔时间为 1 TIM Prescaler 72M 1 TIM Period 1 7199 72M 1 9999 1秒 inclu
  • 内存对齐

    最近为了找工作 狂补了很多基础知识 自以为掌握的不错了 但是真正笔试 面试的时候才发现不懂的知识真得还很多 对很多知识点的掌握和理解都还停留在表层 今天总结一下关于字节对齐的知识 字节对齐在这个找工作季算是被考烂了 笔试考多少次不记得了 面