【程序设计】内存对齐方式(sizeof的使用)

示例1:


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



本文由Cout_Sev 搜集整理

转载注明出处

http://blog.csdn.net/cout_sev

谢谢!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值