什么是内存对齐?为什么需要内存对齐?

embedded/2024/12/3 8:29:38/

参考【C/C++】内存对齐(超详细,看这一篇就够了)_c++内存对齐-CSDN博客

1)什么是内存对齐?

内存对齐是一种将数据在内存中的存储位置按照特定规则进行排列的方式。通常,数据会被存储在内存地址是其大小的整数倍的位置上。

例如,一个 4 字节的整数可能会被存储在内存地址是 4 的倍数的位置上。

2)为什么需要内存对齐?

简单来说,就是方便计算机去读写数据。

对齐的地址一般都是 n(n = 2、4、8)的倍数

  1. 1 个字节的变量,例如 char 类型的变量,放在任意地址的位置上;
  2. 2 个字节的变量,例如 short 类型的变量,放在 2 的整数倍的地址上;
  3. 4 个字节的变量,例如 float、int 类型的变量,放在 4 的整数倍地址上;
  4. 8 个字节的变量,例如 long long、double 类型的变量,放在 8 的整数倍地址上;

一、提高内存访问效率

现代计算机体系结构中,内存访问通常是以特定大小的块为单位进行的。如果数据没有按照合适的对齐方式存储,可能会导致处理器需要进行多次内存访问才能获取完整的数据,从而降低内存访问效率。

例如,对于 32 位处理器,如果一个 4 字节的整数存储在内存地址不是 4 的倍数的位置上,处理器可能需要进行两次内存访问才能获取完整的整数。而如果整数存储在 4 的倍数的地址上,处理器可以一次性读取完整的整数,提高了访问效率。

二、满足硬件要求

某些硬件架构可能对数据的对齐有严格要求。如果数据没有正确对齐,可能会导致硬件错误或性能下降。

例如,一些特定的处理器指令可能只对特定对齐地址上的数据进行操作。如果数据没有按照要求对齐,这些指令可能无法正常执行。

三、提高数据结构的性能

对于结构体等复合数据类型,内存对齐可以提高其成员的访问效率。如果结构体的成员没有按照合适的对齐方式存储,访问结构体成员可能需要进行额外的内存访问和数据拼接操作,降低了性能。

例如,如果一个结构体包含一个整数和一个双精度浮点数,由于双精度浮点数通常需要 8 字节对齐,如果整数没有按照合适的方式对齐,访问双精度浮点数可能需要进行额外的内存访问。

基本变量类型所占大小

数据类型

ILP32(32位Linux系统)

LP64(大部分64位Linux系统)

LLP64(64位Windows系统)

char

1 字节

1 字节

1 字节

short

2 字节

2 字节

2 字节

int

4 字节

4 字节

4 字节

float

4 字节

4 字节

4 字节

long

4 字节

8 字节

4 字节

double

8 字节

8 字节

8 字节

long long

8 字节

8 字节

8 字节

指针 point

4 字节

8 字节

8 字节

枚举 enum

4 字节

4 字节

4 字节

结构体对齐的研究:

1

struct stu1 {char a[18];double b;char c;int d;short e;
};
//48字节

2

struct stu1 {char a[18];int b[3];short c;char d;int e;short f;
};
//44字节

3

struct stu1 {int a;char b[8];float c;short d;
};
//20字节

4

enum DAY {
    MON = 1, TUE, WED, THU, FRI, SAT, SUN
};
struct stu1 {char a[5];char b[3];enum DAY day;int *c;short d;int e;
};
//32位)24字节    64位)32字节

32

64


http://www.ppmy.cn/embedded/142552.html

相关文章

第六届国际科技创新学术交流会暨管理科学信息化与经济创新发展(MSIEID 2024)

重要信息 大会官网:msieid2024.iaecst.org (点击了解大会,参会等内容) 大会时间:2024年12月6-8日 大会地点:中国-广州 大会简介 随着全球化和信息化的不断深入,管理科学、信息化和经济发展…

windows下kafka初体验简易demo

这里提供了windows下的java1.8和kafka3.9.0版本汇总,可直接免费下载 【免费】java1.8kafka2.13版本汇总资源-CSDN文库 解压后可以得到一个文件夹 资料汇总内有一个kafka文件资料包.tgz,解压后可得到下述文件夹kafka_2.13-3.9.0,资料汇总内还…

LabVIEW实现串口调试助手

目录 1、串口通信原理 2、硬件环境部署 3、串口通信函数 4、程序架构 5、前面板设计 6、程序框图设计 本专栏以LabVIEW为开发平台,讲解物联网通信组网原理与开发方法,覆盖RS232、TCP、MQTT、蓝牙、Wi-Fi、NB-IoT等协议。 结合实际案例,展示如何利用LabVIEW和常用模块实现物联…

C# 中的设计模式:构建灵活且可维护的应用程序

C#中的设计模式(Design Patterns)。设计模式是软件开发中常见问题的通用解决方案,它们提供了一种标准化的方法来解决特定的设计问题。通过使用设计模式,可以提高代码的可维护性、可扩展性和复用性。以下是一篇关于C#中常用设计模式…

最大子数组和

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 示例 1: 输入:nums [-2,1,-3,4,-1,2,1,-5,4] 输出&#xff…

【NoSQL数据库】Hbase基本操作——数据库表的增删改查

目录 一、Hbase原理 二、HBase数据库操作 三、遇到的问题和解决方法 一、Hbase原理 HBase的数据模型: 行键 时间戳 列族:contents 列族:anchor 列族:mime “com.cnn.www” T9 Achor:cnnsi.com”CNN” T8 Achor:…

【计算机网络】实验 5:IPV4地址的分类地址及划分子网

实验 5:IPV4地址的分类地址及划分子网 一、 实验目的 加深对IPV4地址的分类地址的了解。 加深对IPV4地址的划分子网的了解。 二、 实验环境 • Cisco Packet Tracer 模拟器 三、 实验内容 1、验证分类IP地址的作用以及了解路由器的基本功能 (1) 第一步&…

【论文复现】DETR[端到端目标检测]

📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀ DETR 概述模型主体框架 演示效果DETR 进行目标检测 核心逻辑使用方式部署方式数据准备参考文献 概述 在目标检测需要许多手工设计的组件&…