C++内存储器布局面试题
C++内存布局面试题【据说是腾讯面试题】#include stdio.h#include windows.hclassA { WORDm_a1 WORDm_a
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