内存对齐方式

示例1:

<span style="font-size:18px;">#include <iostream>

using namespace std;

struct Node1{
    bool m1;
    int m2;
	bool m3;
	double m4;
	bool m5;
};
// struct Node2{
//     char m1;
//     char m2;
// 	int m3;
// };

int main()
{
	cout << sizeof(Node1) << endl;
/*	cout << sizeof(Node2) << endl;*/
}</span>

输出结果:32

原因:double(8) > int(4) > bool(1)

所以在double出现之前采用int,原结构体每个成员变量内存分配为:1、4、1、8、1

故1扩展为4,4保持不变,第二个1必须扩展为8,这样1(4) + 4(4) + 1(8) = 16才能被8整除,最后一个1扩展为8.

总共内存4+4+8+8+8 = 32.

示例2:

<span style="font-size:18px;">#include <iostream>

using namespace std;

struct Node1{
    bool m1;
	bool m3;
    int m2;
	double m4;
	bool m5;
};
// struct Node2{
//     char m1;
//     char m2;
// 	int m3;
// };

int main()
{
	cout << sizeof(Node1) << endl;
/*	cout << sizeof(Node2) << endl;*/
}</span>

输出结果:24

原因:参考第一条

示例3:数组

<span style="font-size:18px;">#include <iostream>

using namespace std;
//
// struct Node1{
//     bool m1;
// 	bool m3;
//     int m2;
// 	double m4;
// 	bool m5;
// };
struct Node2{
    char m1;
    char m2[6];
};

int main()
{
/*	cout << sizeof(Node1) << endl;*/
	cout << sizeof(Node2) << endl;
}</span>

结果:7

原因:char数组不可看成一个对齐整体,Node2对齐基于1;故结果为7;

示例4:结构体中的结构体

<span style="font-size:18px;">#include <iostream>

using namespace std;

struct Node1{
    char m1;
    double m2;
	char m3;
};
struct Node2{
	char m1;
	Node1 m2;
};

int main()
{
/*	cout << sizeof(Node1) << endl;*/
	cout << sizeof(Node2) << endl;
}</span>

输出结果:32

原因:

Node1为24,这个参考示例1;

但是Node1中的对齐基数是8;因为Node2中只有char m1,基数为1小于Node1的基数8;

所以采取Node1的对齐基数8;但是Node1是一个整体,不能将其填充部分的内容分给Node2中的m1使用。故

m1必须同样分配8字节给他,总字节数;8+24=32

时间: 2024-11-25 06:36:34

内存对齐方式的相关文章

&lt;转&gt; Struct 和 Union区别 以及 对内存对齐方式的说明

转载地址:http://blog.csdn.net/firefly_2002/article/details/7954458 一.Struct 和 Union有下列区别: 1.在存储多个成员信息时,编译器会自动给struct第个成员分配存储空间,struct 可以存储多个成员信息,而Union每个成员会用同一个存储空间,只能存储最后一个成员的信息. 2.都是由多个不同的数据类型成员组成,但在任何同一时刻,Union只存放了一个被先选中的成员,而结构体的所有成员都存在. 3.对于Union的不同成

C#调用C++ 平台调用P/Invoke 结构体--内存对齐方式、union封装【七】

[1]内存对齐方式 C++代码: #pragma pack(push) #pragma pack(1) typedef struct _testStru2 { int iVal; char cVal; __int64 llVal; }testStru2; #pragma pack(pop) EXPORTDLL_API void Struct_PackN( testStru2 *pStru ) { if (NULL == pStru) { return; } pStru->iVal = 1; pS

C++内存对齐方式

转自http://www.blogfshare.com/memory-alignment.html 一.什么是内存对齐.为什么需要内存对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐. 字,双字,和四字在自然边界上不需要在内存中对齐.(对字,双字,和四字来说,自然边界分别是偶数地址,可以

C语言中内存对齐方式

position:static(静态定位) 当position属性定义为static时,可以将元素定义为静态位置,所谓静态位置就是各个元素在HTML文档流中应有的位置 podisition定位问题.所以当没有定义position属性时,并不说明该元素没有自己的位置,它会遵循默认显示为静态位置,在静态定位状态下无法通过坐标值(top,left,right,bottom)来改变它的位置. position:absolute(绝对定位) 当position属性定义为absolute时,元素会脱离文档流

windows和Linux内存的对齐方式

一.内存对齐的初步讲解 内存对齐可以用一句话来概括: "数据项只能存储在地址是数据项大小的整数倍的内存位置上" 例如int类型占用4个字节,地址只能在0,4,8等位置上. 例1: #include <stdio.h> struct xx{ char b; int a; int c; char d; }; int main() { struct xx bb; printf("&a = %p\n", &bb.a); printf("

内存对齐分配策略(含位域模式)

1. 内存对齐定义 现在使用的计算机中内存空间都是按照字节划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但是实际上计算机系统对于基本数据类型在内存中的存放位置都有限制,要求这些数据存储首地址是某个数K的倍数,这样各种基本数据类型在内存冲就是按照一定的规则排列的,而不是一个紧挨着一个排放,这就是内存对齐. 对齐模数 内存对齐中指定的对齐数值K成为对齐模数(Alignment Modulus).当一种类型S的对齐模数与另一种类型T的对齐模数的比值是大于1的整数,我们就称类型S的对齐

内存补齐序列一:关于内存对齐和填充

这个问题困扰许久,查了许多资料,网上众说纷纭,整理如下: 对于内存补齐的详细情况,请关注下一篇:C/C++ 内存补齐机制 一.内存对齐的初步讲解 内存对齐可以用一句话来概括: "数据项只能存储在地址是数据项大小的整数倍的内存位置上(分别为偶地址.被4整除的地址.被8整除的地址 )" 例如int类型占用4个字节,地址只能在0,4,8等位置上. 例1: #include <stdio.h> struct xx{ char b; int a; int c; char d; };

内存对齐与自定义类型

一.内存对齐 (一).为什么会有内存对齐? 1.为了提高程序的性能,数据结构(尤其是栈)应该尽可能的在自然边界上对齐.原因是为了访问未对齐的内存,处理器需要进行两次访问,而访问对齐的内存,只需要一次就够了.这种方式称作"以空间换时间"在很多对时间复杂度有要求问题中,会采用这种方法. 2.内存对齐能够增加程序的可移植性,因为不是所有的平台都能随意的访问内存,有些平台只能在特定的地址处处读取内存. 一般情况下内存对齐是编译器的事情,我们不需要考虑,但有些问题还是需要考虑的,毕竟c/c++是

内存对齐,大端字节 &nbsp; 序小端字节序验证

空结构体:对于空结构体,就是只有结构体这个模子,但里面却没有元素的结构体. 例: typedef struct student { }std: 这种空结构体的模子占一个字节,sizeof(std)=1. 柔性数组: 结构体中最后一个元素可以是一个大小未知的数组,称作柔性数组成员,规定柔性数组前面至少有一个元素. typedef struct student { int i; char arr[];     //柔性数组成员 }std: sizeof(std)=4; sizeof求取该结构体大小是