首页 > 系统相关 >结构体中的内存对齐

结构体中的内存对齐

时间:2024-07-25 16:19:05浏览次数:16  
标签:读取 访问 内存 体中 字长 对齐 CPU

什么是内存对齐

计算机中内存的地址空间是按照 byte 来划分的,从理论上讲对任何类型变量的访问可以从内存中的任意地址开始,但实际情况是:在访问特定类型变量的时候通常在特定的内存地址访问,这就需要对这些数据在内存中存放的位置进行限制,各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。编译器将程序中的每个 数据单元 的地址安排在机器字的整数倍的地址指向的内存之中。

为什么要进行内存对齐

主要是由于 CPU 的访问内存的特性决定,CPU 访问内存时并不是以字节为单位来读取内存,而是以机器字长为单位,实际机器字长由 CPU 数据总线宽度决定的。实际 CPU 运行时,每一次控制内存读写信号发生时,CPU 可以从内存中读取数据总线宽度的数据,并将其写入到 CPU 的通用寄存器中。比如 32 位 CPU,机器字长为 4 字节,数据总线宽度为 32 位,如果该 CPU 的地址总线宽度也是为 32 位,则其可以访问的地址空间为 [0,0xffffffff]。内存对齐的主要目的是为了减少 CPU 访问内存的次数,加大 CPU 访问内存的吞吐量。假设读取 8 个字节的数据,按照每次读取 4 个字节的速度,则 8 个字节需要 CPU 耗费 2 次读取操作。CPU 始终以字长访问内存,如果不进行内存对齐,很可能增加 CPU 访问内存的次数。
image
比如以上在读取变量 b 时,如果不进行内存对齐的话,会导致 CPU 读取次数为 2,在内存对齐的情况下,只需读取一次即可。首先,CPU访问按字长访问内存,每次读4个字节(对于32位计算机而言)。如果存储没有对齐,则b需要分两次读,因为b跨在了第一个字长和第二个字长中间

内存对齐的原则

一、结构体对齐规则首先要看有没有用#pragma pack宏声明,这个宏可以改变对齐规则
二、在没有#pragma pack这个宏的声明下,遵循下面三个原则:

  1. 第一个成员的首地址为0.
  2. 每个成员的首地址是自身大小的整数倍
  3. 结构体的总大小,为其成员中所含最大类型的整数倍

参考资料:C语言 | 关于结构体内存对齐,看这篇就够了

标签:读取,访问,内存,体中,字长,对齐,CPU
From: https://www.cnblogs.com/xdhisgood-xy/p/18323466

相关文章

  • CTF-内存取证题目
    (1)首先看见建材文件的基本系统信息(2)从内存中获取到用户admin的密码并且破解密码,以flag{admin,password}形式提交(密码为6位)首先列举用户信息从内从中获取密码的hash值29fb61bd2963b1975cf435a2565af910则Flag{admin:.dfsddew}(3)获取当前系统IP地址以及主机名,以Flag{ip:主机名......
  • C++深拷贝构造函数解决浅拷贝的堆区内存重复释放问题
    1.简单介绍先简单介绍一下浅拷贝和深拷贝:浅拷贝->简单的赋值拷贝操作,默认的拷贝构造函数就是浅拷贝。深拷贝->在堆区重新申请空间,进行拷贝操作。2.问题展示下面用代码示例明了地展示默认拷贝构造函数浅拷贝带来地堆区内存重复释放问题:#include<iostream>usingnamespace......
  • 4、内存品牌分类介绍(金士顿) - 计算机硬件品牌系列文章
    金士顿科技是全球最大的存储产品制造商之一,‌成立于1987年,‌由杜纪川和孙大卫创立。‌金士顿的产品线涵盖了超过2000种内存产品,‌包括但不限于小型机、‌工作站、‌服务器、‌激光打印机、‌数码相机、‌笔记本等,‌并与世界知名品牌厂商如HP、‌DELL、‌IBM、‌SUN、‌APPLE......
  • JVM 内存结构、垃圾回收机制与并发容器
    目录一、JVM内存结构 1.程序计数器(ProgramCounterRegister): 2.Java虚拟机栈(JVMStack): 3.本地方法栈(NativeMethodStack): 4.堆(Heap): 5.方法区(MethodArea):二、垃圾回收机制 1.标记-清除算法: 2.复制算法: 3.标记-整理算法: 4.分代收集:三、并发容器......
  • 02-2 【编写loader工程内容】检测内存容量
    方法:利用BIOS中断来检测内存容量,具体是BIOSINT0x15(或INT15H)具体使用方法:参考文档链接:https://wiki.osdev.org/Detecting_Memory_(x86)实操(1)首先定义一个结构体因为内存是分成好多块的,有一些是已经被硬件占用了:因此检测内存返回的结构体应该是个结构体数组......
  • 在C++里如何释放内存的时候不调用对象的析构函数?
    今天,看到一个有趣的面试题,问题是:在C++里如何释放内存的时候不调用对象的析构函数?之所以有趣,是因为这个问题违反了C++中资源管理的RAII(资源获取即初始化),它要求资源的释放应当和对象的生命周期紧密相关。在正常情况下,当对象离开其作用域时,它的析构函数被调用,以释放它所管理的......
  • 【C语言】动态内存管理详解!!!
    目录为什么存在动态内存分配?动态内存函数的介绍常见的动态内存错误几个经典的笔试题 C/C++程序的内存开辟柔性数组为什么存在动态内存分配?在动态内存函数之前,我们知道的内存开辟有两种。1. 在栈空间上开辟四个字节。intval=20;2. 在栈空间上开辟10个字节的......
  • Java内存模型全解析:解决共享变量可见性与指令重排难题
    本期说一下Java内存模型(JavaMemoryModel,JMM)及共享变量可见性问题。“以下内容出自本人整理的面试秘籍。点击此处,无套路免费获取面试秘籍JMM是什么?答:Java内存模型(JavaMemoryModel,JMM)抽象了线程和主内存之间的关系就比如说线程之间的共享变量必须存储在主内存......
  • 关于内存条选择的一些看法
    先叠甲,只是个人看法以及近期学的知识,欢迎大家讨论,我的知识面也不够全面电脑的内存条分为DDR4与DDR5需要与主板的卡槽对应,挑选需要关注三个核心:容量,频率,参数。先说一下容量,内存条的容量的选择关乎于你的日常工作量,需不需要多开各类办公软件,以及你玩什么类型的游戏,容量越大越流畅......
  • Java 内存模型
    Author:ACatSmilingSince:2024-07-24概念Java内存模型:JavaMemoryModel,简称JMM,是Java语言中定义的一组规则和规范,用于解决多线程环境下的内存可见性和有序性问题。JMM确定了线程之间如何通过内存进行交互,并规定了变量的读取和写入操作的行为。JMM能干吗?通过JMM来......