当前位置:天才代写 > tutorial > C语言/C++ 教程 > c/c++中内存对齐详解

c/c++中内存对齐详解

2017-11-02 08:00 星期四 所属: C语言/C++ 教程 浏览:42

一,什么是内存对齐?内存对齐用来做什么?

所谓内存对齐,是为了让内存存取更有效率而回收的一种编译阶段优化内存存取的手段。

好比对付int x;(这里假设sizeof(int)==4),因为cpu对内存的读取操纵是对齐的,假如x的地点不是4的倍数,那么读取这个x,需要读取两次共8个字节,然后还要将其拼接成一个int,这比存取对齐过的x要贫苦许多。

二,怎么算内存对齐巨细(理论)?

对付简朴范例,如int,char,float等,其对齐巨细为其自己巨细,即align(int) == sizeof(int),align(char)==sizeof(char),等等。

对付复合范例,如struct,class,其自己并无所谓对齐,因为CPU没有直接存取一个struct的指令。对付struct而言,它的对齐指的是它内里的所有成员变量都是对齐的,class同理。

下面就讲讲struct对齐是怎么回事。

首先要大白三个点:

1,内存对齐是指首地点对齐,而不是说每个变量巨细对齐;

2,布局体内存对齐要求布局体内每一个成员变量都是内存对齐的;

3,布局体对齐除了第2点之外还要求布局体数组也必需是对齐的,也就是说每个相邻的布局体内部都是对齐的。

OK,先知道上面这3点之后,开始打仗怎么算对齐巨细。

措施员可本身指定某些数据的对齐巨细,通过利用下面的预处理惩罚指令,指定对齐巨细为x。(这里需要留意:只能指定2的n次方作为对齐巨细,对付指定对齐巨细为6,9,10这样的编译器大概会不予剖析)

#pragma pack(x)  
//...  
#pragma pack()

那到此刻,大概各人有个疑问了,那对付int(这里假设sizeof(int)==4),手动指定对齐巨细为8,那align(int)是便是sizeof(int)照旧便是8呢 ?

这里各人可以记着,align(x) = min ( sizeof(x) , packalign) , 即sizeof(x)和指定对齐巨细哪个小,对齐巨细就为哪个。

因此,上面的疑问谜底是align(int)=sizeof(int)=4 。

三,怎么算内存对齐巨细(示范)?

#include <cassert>  

int main(int argc, char* argv[])
{
//此处指定对齐巨细为1
//对付a,实际对齐巨细为min(sizeof(int),1)=min(4,1)=1
//对付b,实际对齐巨细为min(sizeof(char),1)=min(1,1)=1
//编译器会确保TEST_A首地点即a的地首址是1字节对齐的,此时a对齐
//

利用msvc未果真编译选项可以查察c++类的内存机关。利用要领:启动vs呼吁行,输入cl 【source.cpp】 /d1reportSingleClassLayout【CBaseClass1】以查察单个class的内存机关,输入cl 【source.cpp】 /d1reportAllClassLayout以查察所有类的内存机关。留意:/d1reportSingleClassLayout【CBaseClass1】没有空格 !!

各人可以用这个来比较我上面讲的例子来看编译器是怎么布置对齐的。

这个东东是神器,雷同于宏展开时的选项(输出与处理惩罚过之后的源文件),一切内部机关方面的真相全都展此刻你面前,包罗坑脑细胞的虚函数、虚函数表、虚基类表、虚担任等一系列坑爹。

 

    关键字:


天才代写-代写联系方式