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++,c,面试,C#,腾讯)