C++中的内存对齐

内存对齐

在我们的程序中,数据结构还有变量等等都需要占有内存,在很多系统中,它都要求内存分配的时候要对齐,这样做的好处就是可以提高访问内存的速度。

我们还是先来看一段简单的程序:

程序一

#include <iostream>
 2 using namespace std;
 3 
 4 struct X1
 5 {
 6   int i;//4个字节
 7   char c1;//1个字节
 8   char c2;//1个字节
 9 };
10 
11 struct X2
12 {
13   char c1;//1个字节
14   int i;//4个字节
15   char c2;//1个字节
16 };
17 
18 struct X3
19 {
20   char c1;//1个字节
21   char c2;//1个字节
22   int i;//4个字节
23 };
24 int main()
25 {   
26     cout<<"long "<<sizeof(long)<<"\n";
27     cout<<"float "<<sizeof(float)<<"\n";
28     cout<<"int "<<sizeof(int)<<"\n";
29     cout<<"char "<<sizeof(char)<<"\n";
30 
31     X1 x1;
32     X2 x2;
33     X3 x3;
34     cout<<"x1 的大小 "<<sizeof(x1)<<"\n";35     cout<<"x2 的大小 "<<sizeof(x2)<<"\n";36     cout<<"x3 的大小 "<<sizeof(x3)<<"\n";37     return 0;38 }

这段程序的功能很简单,就是定义了三个结构X1,X2,X3,这三个结构的主要区别就是内存数据摆放的顺序,其他都是一样的,另外程序输入了几种基本类型所占用的字节数,以及我们这里的三个结构所占用的字节数。

这段程序的运行结果为:

long 4
2 float 4
3 int 4
4 char 1
5 x1 的大小 8
6 x2 的大小 12
7 x3 的大小 8

结果的前面四行没有什么问题,但是我们在最后三行就可以看到三个结构占用的空间大小不一样,造成这个原因就是内部数据的摆放顺序,怎么会这样呢?

下面就是我们需要讲的内存对齐了。

内存是一个连续的块,我们可以用下面的图来表示,  它是以4个字节对一个对齐单位的:

图一

让我们看看三个结构在内存中的布局:

首先是 X1,如下图所示

X1 中第一个是
Int类型,它占有4字节,所以前面4格就是满了,然后第二个是char类型,这中类型只占一个字节,所以它占有了第二个4字节组块中的第一格,第三个也
是char类型,所以它也占用一个字节,它就排在了第二个组块的第二格,因为它们加在一起大小也不超过一个块,所以他们三个变量在内存中的结构就是这样
的,因为有内存分块对齐,所以最后出来的结果是8,而不是6,因为后面两个格子其实也算是被用了。

再次看看X2,如图所示

X2中第一个类型是Char类型,它占用一个字节,所以
它首先排在第一组块的第一个格子里面,第二个是Int类型,它占用4个字节,第一组块已经用掉一格,还剩3格,肯定是无法放下第二Int类型的,因为要考
虑到对齐,所以不得不把它放到第二个组块,第三个类型是Char类型,跟第一个类似。所因为有内存分块对齐,我们的内存就不是8个格子了,而是12个了。

再看看X3,如下图所示:

关于X3的说明其实跟X1是类似的,只不过它把两个1个字节的放到了前面,相信看了前面两种情况的说明这里也是很容易理解的。

唉,写到这手都累了,关键是要画图,希望通过此文能让你理解内存对齐的基本概念,如果有问题,请留言。

此文完

时间: 2024-12-09 17:06:01

C++中的内存对齐的相关文章

【C语言】结构体中的内存对齐问题

话说大家有没有发现结构体中的内存对齐问题很有意思呢?我们这一次就一起研究一下这个问题为什么值得人探讨. 结构体内存对齐有三个原则; 1.数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储). 2.结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有s

20160402_C++中的内存对齐

原题: 有一个如下的结构体: struct A{  long a1;  short a2;  int a3;  int *a4; }; 请问在64位编译器下用sizeof(struct A)计算出的大小是多少? 答案:24 -------------------------------------------------------------------------------- 本题知识点:C/C++ 预备知识:基本类型占用字节 在32位操作系统和64位操作系统上,基本数据类型分别占多少字节

Delphi中的内存对齐 与 Packed关键字

以delphi为例:TTest = recordc1: char;i1: Integer;c2: char;c3: Char;end;这个结构如果用sizeof取其占用的内存大小,是多少呢,是1+4+1+1=7么,不是,是4*3 = 12; 这是因为32位编译的时候,默认结构会自动内存对齐(32bit = 4byte). 如果要想让这个结构占用7个字节的话,必须加上packed关键字.如下:TTest = packed recordc1: char;i1: Integer;c2: char;c3

C/C++中的内存对齐问题和pragma pack命令详解

这个内存对齐问题,居然影响到了sizeof(struct)的结果值.突然想到了之前写的一个API库里,有个API是向后台服务程序发送socket请求.其中的socket数据包是一个结构体.在发送socket之前,会检测数据的长度:服务端接收到数据后也会检测长度.如果说内存对齐问题影响到了结构体的sizeof,那么socket发送结构体的时候,是怎么发送的?发送的内容中是否包含结构体中的“空洞”?如果API库中的对齐方式没有设定,那么服务端和客户端的sizeof结果将不同,这会引起很多问题吗? 下

C/C++中的内存对齐 C/C++中的内存对齐

一.什么是内存对齐.为什么需要内存对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐. 字,双字,和四字在自然边界上不需要在内存中对齐.(对字,双字,和四字来说,自然边界分别是偶数地址,可以被4整除的地址,和可以被8整除的地址.)无论如何,为了提高程序的性能,数据结构(尤其是栈)应该尽可能

C语言中的内存对齐

由下面的测试代码可以总结出两点:(1)内存对齐是针对结构体而言的    (2)编译时char类型的申请的空间由其后面的数据类型决定. #include<stdio.h> enum Season { Spring,Summer,Autumn }; enum ENUM Enum = Autumn; union UNION { int a; char b; double c; }; union UNION Union; struct STRUCT { char b; //4字节 int a; //4

C或C++中struct内存对齐计算精简方案

struct占用内存计算方法: 假设struct的起始地址是0x00000000,则从起始地址开始到当前元素为止所占用的空间“和”,必须是下一个成员空间的整数倍(未达到整数倍的部分留空),当到达最后一个成员的时候,即要计算总struct空间的时候,这个空间必须是所有成员中最大基本元素的整数倍. 如果struct的某一个元素是数组,只需对齐到基本元素即可,不用对齐整个数组 所以,定义结构体的时候,尽量将同一类型的变量声明在一起,而且按照占用空间大小,使用由小到大排列或者由大到小排列的方式,例如占用

关于内存对齐的那些事

Wrote by mutouyun. (http://darkc.at/about-data-structure-alignment/) 1. 内存对齐(Data Structure Alignment)是什么 内存对齐,或者说字节对齐,是一个数据类型所能存放的内存地址的属性(Alignment is a property of a memory address). 这个属性是一个无符号整数,并且这个整数必须是2的N次方(1.2.4.8.--.1024.--). 当我们说,一个数据类型的内存对齐

C语言中内存对齐

今天一考研同学问我一个问题,一个结构体有一个int类型成员和一个char类型成员,问我这个结构体类型占多少个字节,我直接编个程序给他看结果.这个结构体占八个字节,咦,当时我蛮纳闷的,一个int类型四个字节,一个char类型一个字节,怎么这个结构体的大小不是五个字节呢??上网查了一下,结果发现还有个内存对齐的问题. 为了方便操作系统访问内存,一次访问四个字节,为了避免一个变量的二次访问,通常设置采用内存对齐. 1 #include<stdio.h> 2 3 typedef struct 4 {