c++数据结构内存对齐方式

============================================================

 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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值