码迷,mamicode.com
首页 > 编程语言 > 详细

C/C++内存对齐

时间:2015-02-04 20:05:15      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:

0xFF  最近在看<c++反汇编与逆向技术>书,今天来说一下"内存对齐"。

    记得上大一第二学期的时候,学C++时,有一次碰到了一个计算结构体大小的问题,按照sizeof(type)的加法口算出来的和实际运行出来的不一样,

明明口算得到 sizeof(int) + sizeof(short) = 6 ?

技术分享

 

但结果是 8 。  这个当时简直就醉了,也不知道怎么个回事,今天就来了却这个事。

 

 

0x00这就是C/C++ 中 结构体(类) "内存对齐" 问题,

由于VC++ 6.0中的默认对齐大小是8字节,而进行对齐计算时是这样操作的,假设当前 type 的sizeof() 结果为 N , M 表示默认对齐大小,此时为 8字节,

实际的对齐值为 q = MIN(N,M),此成员就要安排在以q 的整数倍 表示的内存地址上,

struct tagstr

{

short s;      //假设这个地址是0x0012FF74 

int i;        //这个按照道理应该在 0x0012FF76 ,但实际其实是在 0x0012ff78,因为 0x0012FF76 不是 sizeof(int)的整数倍,

          // 需要加两个字节 "补齐"

};       

 

   

0x01验证:

技术分享

 

0x02 自定义对齐

能不能自定义对齐大小呢_____________ ?  当然可以。

可在预编译指令加上 #pragma pack(N) 来定义对齐大小, 

 1 #include "iostream"
 2 //对齐
 3 #pragma pack(1)  // 1 字节对齐
 4 
 5 using namespace std;
 6 
 7 struct strtag
 8 {
 9     short s;
10     int i;
11 };
12 
13 
14 void main()
15 {
16         strtag st;
17 
18         st.s = 9;
19         st.i = 4;
20 
21     printf(" %d ",sizeof(st));
22 }

 

0x03看下结果:

技术分享

 

按照结果可以得到,此时为1字节对齐,当然结果也变成了 6 。

                          End : 好了,大致的疑惑也基本清楚了,就到这里。

 

C/C++内存对齐

标签:

原文地址:http://www.cnblogs.com/yllen/p/mem_op.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!