ToB企服应用市场:ToB评测及商务社交产业平台

标题: C++ 内存对齐 [打印本页]

作者: 去皮卡多    时间: 2022-8-9 14:44
标题: C++ 内存对齐
概述

问题:
  1. struct Foo1
  2. {
  3.         char a;
  4.         char b;
  5.         int c;
  6. }
复制代码
创建结构体Foo
  1. struct Foo
  2. {
  3.         int a;
  4.         int b;
  5. }
复制代码
查看Foo的内存布局

1>class Foo        size(8):
1>        +---
1> 0        | a
1> 4        | b
1>        +---
在32位的系统中,int占4个字节,Foo内存布局占用8个字节内存。
创建结构体Foo1,Foo2,Foo3
  1. struct Foo1
  2. {
  3.         char a;
  4.         char b;
  5.         int c;
  6. };struct Foo2{        char a;        int c;        char b;};struct Foo3{        int c;        char a;        char b;};
复制代码
查看Foo1,Foo2,Foo3的内存布局

1>class Foo1        size(8):
1>        +---
1> 0        | a
1> 1        | b
1>          | alignment member  (size=2)
1> 4        | c
1>        +---
1>class Foo2        size(12):
1>        +---
1> 0        | a
1>          | alignment member (size=3)
1> 4        | c
1> 8        | b
1>          | alignment member (size=3)
1>        +---
1>class Foo3        size(8):
1>        +---
1> 0        | c
1> 4        | a
1> 5        | b
1>          | alignment member (size=2)
1>        +---

内存对齐会影响内存的分配,以上结构体的内存大小不是6个字节。
内存对齐

现代计算机中内存空间都是按照 byte 划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但是实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地址的值是某个数k(通常它为4或8)的倍数。
内存对齐的意义

跨平台

不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
提升性能

0 0 0 1 1 1 1 0 --不对齐
0 0 0 0 1 1 1 1 --对齐
内存对齐在不同环境下对性能的提升不尽相同,一种情况是:假使32位系统下,处理器读取内存的粒度为4字节。未对齐内存需要读取两次内存,并进行内存剔除,且有可能引发OS异常处理。
内存对齐规则

内存对齐是编译器完成的,不同平台不同编译器内存对齐规则可能不同。
特定平台的编译器都有默认对齐系数。gcc中默认#pragma pack(4),可以通过预编译命令#pragma pack(n),n = 1,2,4,8,16来改变这一系数。
有效对其值:是给定值#pragma pack(n)和结构体中最长数据类型长度中较小的那个。有效对齐值也叫对齐单位。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4