============================================================
Demo_1:
/**********************************************************
文件名: study.cpp
创建/修改者: benben
创建/修改时间: 2012.10.18
功能: 学习 内存对齐的内容
**********************************************************/
#include "stdafx.h"
#include <iostream>
using namespace std;
// 天哥,那个vs2010 的默认对齐方式和vc6有点不同..
// vs2010 默认的方式是在VS2010里,编译器会对内存进行自动对齐(以最高性能方式对齐)。
struct A
{
char c1; // 8
double d; // 8
char c2; // 8
}; // A 总共占 24 字节
struct B
{
char c3; // 8
A obj_a; // 24
char c4; // 8 : c4,c5 共占 8 字节(这个不用讲都能明白的..)
char c5;
}; // B 总共占 40 字节
// 分析: vs2010 的默认内存对齐方式是以最高性能方式对齐..
// 对 A 来说, 当然是以 double 的方式对齐(即 8 字节对齐),所以很容易
// 标出上面每个变量的内存占多少字节(注:这里指包括空出的未使用的部分,下同,不再特别说明)
//
// 分析 B,对于一个结构体里的子对象(即成员变量)各自保持完整性(也就是说,B::c3 与 A::c1 内存上是临近, 但
// 它们之前不会像 B::c4 与 B::c5 之间可以靠在一起) ...但是 结构 B 你可以这样看作(特别说一下,这里指可以"看作")
// struct B_
// {
// char c3; // 8
//
// // 注意下面三个是 A 的一个对象(整体哦..), 所以 c3 的对齐方式也是按double(即B::d的8字节)方式对齐,即是不会c3 和c1 并在一起算8 字节
// // c2 也不能和c4,c5 合在一起了...照这样的方式算不难算出整个结构体的大小为 40
// char c1; // 8
// double d; // 8
// char c2; // 8
//
// char c4; // 8 : c4,c5 共占 8 字节(这个不用讲都能明白的..)
// char c5;
// };
// 分析完B 后,不难得出 C 的大小吧..
struct C
{
char c3;
A obj_a;
char c4;
A obj_a2;
int i;
};
int main(int argc, char *argv[])
{
cout<< "test:" << endl;
cout << "sizeof(A) = " << sizeof(A) << endl;
cout << "sizeof(B) = " << sizeof(B) << endl;
cout << "sizeof(C) = " << sizeof(C) << endl;
return 0;
}
=============================================================
Demo_2:
/**********************************************************
文件名: study_2.cpp
创建/修改者: benben
创建/修改时间: 2012.10.18
功能: 学习 内存对齐的内容
**********************************************************/
#include "stdafx.h"
#include <iostream>
using namespace std;
struct A
{
char c1; // 4
int i; // 4
char c2; // 4
}; // A 总共占 12 字节
struct B_1
{
char c3; // 4
int i; // 4
A obj_a; // 12
char c4; // 4
double d; // 8
}; // B 总共占 32 字节
struct B_2
{
char c3; // 4
A obj_a; // 12
char c4; // 8
double d; // 8
}; // B_2 总共占 32 字节
struct B_3
{
char c3; // 4
int i; // 4
char c6; // 4
A obj_a; // 12
char c4; // 8
double d; // 8
}; // B_3 总共占 32 字节
// 分析完B 后,不难得出 C 的大小吧..
struct C
{
char c1; // 8
double d; // 8
char c2; // 8
};
// 分析完B 后,不难得出 C 的大小吧..
struct D
{
char c1; // 4
C obj_c1; // 4
char c2; // 4
};
int main(int argc, char *argv[])
{
cout<< "test:" << endl;
cout << "sizeof(A) = " << sizeof(A) << endl;
cout << "sizeof(B_1) = " << sizeof(B_1) << endl;
cout << "sizeof(B_2) = " << sizeof(B_2) << endl;
cout << "sizeof(B_3) = " << sizeof(B_3) << endl;
cout << "sizeof(C) = " << sizeof(C) << endl;
cout << "sizeof(D) = " << sizeof(D) << endl;
cout<<"-----------------------"<<endl;
// 对内存的占据都可以用以下方法验证...
// 这样求得的 B_1 中 i 占的内存空间大小(这里指包括了那个留白的内存啊...)
cout<< offsetof(B_1, obj_a) - offsetof(B_1, i) <<endl;
// ... 不一一列举了..
return 0;
}
总结分析:
// 判断内存的大小,首先找那个结构体中 内置类型(当然包括成员里面的内置类型了)
// 最大的即是内存对齐的字节数
// 如:B_1 的对齐字节数为 B_1::d 的大小(即是8)
//
// 分析 B_1 可以从上开始判断, 首先 sizeof(c3) = 1 < 8,
// 继续看 sizeof(i) = 4 > sizeof(c3) ,此时已经要考虑对齐的问题了,这里c3,i 中
// 较大者为 4,那就按 4 字节对齐.. 所以可以标示 c3-->4, i-->4。
// c3 和 i 已经组成的内存为8 的倍数.可以不考虑与后面数据的对齐了(因为它自身都够齐了哈.)
// 再分析 sizeof(obj_a) = 12 > 1*8; sizeof(obj_a) + sizeof(c4) = 13 > 1*8,
// 而 sizeof(obj_a)+sizeof(c4)+sizeof(d)= 21 > 2*8, 所以obj_a 和 c4 它们两者考虑内存对齐(凑足8的倍数)
// 所以易知 obj-->12, c4-->4.
// 前面的数据都考虑过对齐了,最后一个易知 d--> 8.
原文地址:http://hi.baidu.com/ccc10509/item/b1a10140fd77ce04e8350487