您的位置:首页 > 其它

内存对齐规则

2015-11-23 22:06 381 查看
#include "stdafx.h"
#include <iostream>
using namespace std;

class B
{
public:
double m_a;
char m_b;
short m_c;
int m_d;
char m_e;
int m_f;
};

class C
{
public:
char m_a;
char m_b;
int m_c;
short m_d;
};

int main()
{
B b;
cout << &b.m_a << endl;
cout << (bool*)&b.m_b << endl;
cout << &b.m_c << endl;
cout << &b.m_d << endl;
cout << (bool*)&b.m_e << endl;
cout << &b.m_f << endl;
cout << sizeof(B) << endl;

C c;
cout << (bool*)&c.m_a << endl;
cout << (bool*)&c.m_b << endl;
cout << &c.m_c << endl;
cout << &c.m_d << endl;
cout << sizeof(C) << endl;

return 0;
}

//用B作为例子,说明对齐规则:
//(1)B中最大的类型为double, 大小为8字节.(以类中最大类型大小作为块的分配单位)
//(2)分配第一块8字节,分给m_a.刚好放下m_a变量。
//(3)分配第二块8字节,首先放入m_b, 只使用了1字节.然后放入m_c,占用2个字节。(类型变动)此时将m_b和m_c看成一个类,那么就要以m_c的类型short作为基本分配单位,
//那么此时m_b就要占用2个字节,第一个字节放入真实的内容,第二个字节作为占位(无内容), m_c 占用2字节。所以这里一共占用了4byte.接下来放入m_d, m_d为
//int类型,占用4字节。此时刚好填满了8byte, 于是这块8byte内存使用完毕
//(4)分配第三块8字节,放入m_e, m_e占用1字节,然后放入m_f,占用4个字节。(类型变动)此时将m_e和m_f 看成一个类,那么就要以m_f的类型int做为基本的分配单位,
//那么此时m_e就要占用4个字节,第一个字节放入真实的内容,剩余3个字节作为占位(无内容),m_f占用8字节中的剩余4字节.

//基本规则:
//(1)找到类中变量类型最大的类型。以此作为块分配单位。
//(2)尽量填满每块的内容。
//(3)类型发生变化的时候,要特别注意。


输出:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: