读书人

C++内存储器布局面试题

发布时间: 2012-10-24 14:15:58 作者: rapoo

C++内存布局面试题
【据说是腾讯面试题】

#include <stdio.h>#include <windows.h>class   A { WORD   m_a1; WORD   m_a2; A(){m_a1=1;m_a2=2;} void   fun(){printf( "%d,%d ",m_a1,m_a2);} } class   B { DWORD   m_a3; B(){m_a3=3;} void   fun(){printf( "%d ",m_a3);} } main() { A   a; B   *pb; pb=B*(&a); pb-> fun(); } 


**以下资料来自网友回帖讨论**

输出结果:131073 = pow(2,17) + 1

将a指向一个A类型的域,在pb = (B*)&a时将pb强行指向了a所指向的区域
所以将会以B的DWORD格式读取A中2个WORD类型,所以值应该为2的17次方加1

1,A中的两个WORD连续存储,为00000000|00000001 00000000|00000010
2,强制转换之后,两个WORD成为一个DWORD
3,这个可能比较容易被忽略,这里用的是堆栈空间,因此WORD合并成DWORD时是2前1后.得为
00000000|00000010|00000000|00000001
4,可以试几个char被memcpy到一个int中的情况,也是这种结果.
**
这个题目考了几点:
1、关于sizeof(class),一个类的size只是此类中数据成员的size和。
2、考了内存分配的问题,内存分配都是从低端地址向高端地址分配的,所以是2的17次方加1而非2的16次方加2

读书人网 >C++

热点推荐