博客
关于我
C++ 内存对齐
阅读量:507 次
发布时间:2019-03-07

本文共 1081 字,大约阅读时间需要 3 分钟。

内存对齐的作用及规则解析

内存对齐是一种确保数据在内存中存储位置正确的技术,特别是在不同平台上保证二进制文件的可移植性。它涉及到数据成员在内存中的起始地址以及对齐方式的选择。以下是内存对齐的基本规则及作用分析。

内存对齐规则

内存对齐的规则主要基于工具#pragma pack的指定值以及数据成员的实际长度。具体规则如下:

  • 第一个数据成员的起始地址固定为0,以后每个数据成员的对齐方式取决定于当前成员自身长度和#pragma pack的指定值中的较小值。

  • 当某个结构体包含其他结构体作为成员时,这些嵌套结构体的存储起始地址应按照其内部最次大的基本数据类型成员的长度的整数倍进行对齐。例如,如果结构体B包含char、int和double成员,那么char起始于0,int依次从8开始,double从16开始。

  • 数据结构本身的存储也需要进行对齐。具体而言,对齐方式取决于结构体或联合体中最大的数据成员长度与#pragma pack的指定值中的较小值。

  • 内存对齐的主要作用

    内存对齐的主要价值体现在以下几个方面:

  • 平台兼容性:由于硬件平台对内存访问的限制,不同架构的处理器对内存地址的访问权限有严格规定。内存对齐可以确保数据在各平台上都能被正确解析,避免因无效内存访问而引发硬件异常。

  • 性能提升:内存对齐能够优化CPU的内存访问模式。当数据对齐时,CPU一次可以读取多个字节的数据到寄存器中,减少了额外的访问循环,提高了数据读取速度。此外,对于不支持非对齐内存访问的处理器,这也是内存对齐不可或缺的前提条件。

  • 内存未对齐的潜在问题

    内存未对齐会引发严重的性能问题。以32位CPU为例,对于一个int型数据(占4字节),未对齐可能会导致多次内存访问。具体影响如下:

  • 数据读取效率降低:未对齐的数据需要CPU进行多次读取,例如从第一个字节开始则需要分两次读取,分别获取前三字节和后一字节。这不仅延迟了数据处理,还增加了处理器的负担。

  • 系统稳定性问题:部分处理器严格要求内存访问必须对齐,遇到非对齐访问会抛出硬件错误或 nozzle异常,这可能导致程序崩溃或系统不可用。

  • 内存对齐的应用示例

    对于带有多个数据成员的结构体或类,用内存对齐可以最大化地利用内存空间,避免数据片段跨越。例如:

    • 假设结构体A包含四个浮点数成员,每个浮点数占8字节,且#pragma pack=8。那么结构体中的第二个成员应从8开始,依次类推。
    • 如果某个成员是另一个结构体B,而结构体B中包含一个长度为12字节的double成员,那么结构体B的存储应从8字节的倍数开始,比如从8个多字节的整数倍开始。

    转载地址:http://edejz.baihongyu.com/

    你可能感兴趣的文章
    Python: AES加密与解密
    查看>>
    Python: Range() 最大尺寸;动态的还是静态的?
    查看>>
    Python: Windows下用 multiprocessing 的深坑
    查看>>
    python:Could not find platform independent libraries <prefix>解决方法
    查看>>
    Python:datetime tzinfo 时区名称文档
    查看>>
    Python:deepcopy(list) vs new_list = old_list[:]
    查看>>
    Python:Google API - 从消息中获取 mimeTypes
    查看>>
    Python:Google API - 从消息中获取 mimeTypes
    查看>>
    Python:subprocess.call,stdout to file,stderr to file,在屏幕上实时显示stderr
    查看>>
    Python:TypeError:无法连接“str“和“int“对象
    查看>>
    Python:XPath 在 ElementTree 中不可用
    查看>>
    Python:从 FTP 服务器下载文件
    查看>>
    python:从列表中创建元组列表
    查看>>
    Python:从嵌套列表中删除重复项
    查看>>
    Python:从间隔映射到值
    查看>>
    Python:使用 shell=False 的子进程调用不起作用
    查看>>
    Python:修改 PATH 环境变量的平台无关方式
    查看>>
    Python:假与 0
    查看>>
    Python:函数使用
    查看>>
    Python:函数进阶
    查看>>