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 : 好了,大致的疑惑也基本清楚了,就到这里。
时间: 2024-10-11 04:50:00