首页 > 系统相关 >【学习总结】内存对齐学习汇总

【学习总结】内存对齐学习汇总

时间:2023-03-26 16:55:35浏览次数:40  
标签:struct int 0x0000 学习 bool 内存 对齐

1.内存对齐

1.1 什么是内存对齐

操作系统一般是按照一定长度对内存数据进行处理的,我们常见的32位和64位操作系统,他们默认处理内存的长度分别是4bytes和8bytes。
因此我们在写程序的时候,也需要考虑这一点,如果不考虑内存对齐,考虑如下一个结构体:

struct A {
  short s;
  int i;
} a;

假设当前的设备是32位操作系统,内存地址从0x0000开始。
不做内存对齐这个结构体a存储的地址为:
0x0000-0x0001: s
0x0002-0x0005: i
当我们要取用i这个参数的值时,操作系统只能先把第一块内存(0x0000-0x0003)取出来,然后把第二块内存(0x0004-0x0007)取出来,然后分别取高2bytes和低2bytes组合在一起才能得到i的值。
如果我们做4bytes对其,这个结构体a存储的地址为:
0x0000-0x0003: s
0x0004-0x0007: i
这样我们无论时取s,还是取i,都可以只做一次读取就可以获得,并且不需要做位操作组合这些内存块,极大地提高了程序处理的速度。

1.2 怎么做内存对齐?

内存对齐其实我们的编译器会帮忙做,比如前面的结构体a,如果你是32bytes的编译器,那么就会自动做4bytes对齐,不需要我们人为指定。
当然我们也可以用预处理语句pragma pack自己指定内存对齐的字节数,比如:

#pragma pack(2)
struct A {
  bool b;
  short s;
  int i;
};
#pragma pack() // 恢复默认的字节对齐

这样对齐的结果就是,b(0x0000-0x0001)、s(0x0002-0x0003)、i(0x0004-0x0007),这里虽然bool类型只占一个byte,但是因为做了对齐,还是会放到两个bytes的内存里。

1.3 示例

示例代码:

struct A {
    bool b;
    int i;
    short s;
};

struct B {
    int i;
    short s;
    bool b;
};

#pragma pack(2)
struct C {
    bool b;
    int i;
    short s;
};
#pragma pack()

int main()
{
    std::cout << "size A=" << sizeof(A) << ",size B=" << sizeof(B) << ",size C=" << sizeof(C) << "\n";
    return 0;
}

运行结果:

size A=12,size B=8,size C=8

标签:struct,int,0x0000,学习,bool,内存,对齐
From: https://www.cnblogs.com/echizen/p/17258948.html

相关文章

  • DUTOJ 1282: Zeratul与a+b=c bitset 小内存数组
    问题1282--Zeratul与a+b=c1282:Zeratul与a+b=c时间限制:1Sec  内存限制:32MB提交:148  解决:25[提交][状态][讨论版][命题人:Zeratul]题目描......
  • 一个故事回答工作经验重要还是理论学习重要
     今天去baidu知道上看到一个问题:工作经验重要还是理论学习重要。  有时候,一个简单的道理,却足以给人意味深长的人生启示。  这个故事似乎刚好合适:  古时,甲、有两......
  • javaSE学习Day1之包装类的使用
    包装类的使用包装类的使用java提供8种基本数据类型对应的包装类,使得基本数据类型变量具有类的特征掌握:基本数据类型、包装类、String三者之间的互相转换自动装箱与......
  • makefile 基础学习
    今天主要来记录一下makefile的学习。makefile规则:一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个文件夹中,makefile定义了一系列的规则来指定,哪些文件须要......
  • SpringBoot2 学习资料,基础篇、实用篇、整合篇、原理篇
    SpringBoot2学习资料,需要的请callme省略好多图片。。。。。。......
  • javaSE学习Day1之Object类的使用
    Object类的使用Object类Object类中的方法可以在网上搜索得到Object类是所有java类的父类如果类在声明中未使用extends关键字指明其父类,则默认父类为java.lang.Obje......
  • 第4章 —— 变量、作用域与内存
    4.1原始值和引用值原始值是最简单的数据,引用值是存储在内存中的对象。保存原始值的变量是按值访问的,引用值的变量是按引用访问的。区别:原始值大小固定,保存在栈内存上;......
  • mysql 学习笔记
    ......
  • java----内存模型
    内存模型一个对象的内存图方法区开始运行,先找到Main函数,然后将这个方法入栈.new将会在堆空间中开辟空间,里面有成员变量和成员方法(注意,成员方法保存的是方法区的成员......
  • 安装Windows Server 2022 - 初学者系列 - 学习者系列文章
          这天要写一个关于系统部署的系列文章,涉及到WindowsServer2022操作系统的安装,所以就写了此文。Windows系列的操作系统安装,以前的博文中都有介绍,这里再次做一......