类成员函数大小问题
来源:互联网 发布:网络卫星直播电视 编辑:程序博客网 时间:2024/05/11 19:42
上周,我一同事,在调试我们项目的时候,发现我写的一段代码中,有一个类成员函数指针数组有大小有点怪异,便叫我过去瞧瞧。有如下一段定义:
interface IPLUnknown
{
virtual ~IPLUnknown() {}
};
interface IPLRunnable : public IPLUnknown
{
virtual BOOL Init(void) = 0;
……
};
class CThread;
typedef void (CThread:: *CALLBACK)(const SMsg * const pMsg);
class CThread : public IPLRunnable
,public TPLSingleton<CThread>
{
……
CALLBACK m_mapHandler[MAX_MAP];
……
};
其中,IPLRunnable 是一个纯虚类,MAX_MAP为11,但是在调试的时候,却在Visual C++中看到m_mapHandler的数组个数为22,而sizeof(m_mapHandler[0])为4,sizeof(m_mapHandler)为88,我的那位同事感觉很奇怪。在32位机上,sizeof(m_mapHandler[0])为4是可以理解,但为什么是分配的是22个数组大小,总和为88字节的空间。根据我的经验,我没有理会VC调试器给我们的信息,而是在代码中添加了一些打印输出语句;经过打印输出显示,sizeof(m_mapHandler[0])为8,而不是VC调试器中所显示的4;因此,数组总大小为88个字节,是正确的,只是调试器显示错误罢了。现在问题的焦点转向了什么sizeof(m_mapHandler[0])为8,而不是4?经过测试,我们发现,如果将public IPLRunnable注释掉,则sizeof(m_mapHandler[0])为4,原来是纯虚基类所致。后来我们还将public IPLRunnable改为virtual public IPLRunnable测试sizeof(m_mapHandler[0])则为12,这个比较特别,根据编译器的不同也有所不同。为证实是因编译器而异, 我分别在LINUX下用GCC编译输出,以及在WINDOWS下用MINGW下的GCC编译输出,sizeof(m_mapHandler[0])均为8。值得一提的是,在用GCC编译的程序中,不管是public IPLRunnable还是virtual public IPLRunnable,sizeof(m_mapHandler[0])均为8。
总结:
在VC中,类成员函数指针随基类不同而不同,如果派生类是普通派生于基类,且基类有纯虚函数,则单个指针大小为8字节(32位下);如果基类有纯虚函数,且在派生时,加了virtual关键字,则单个指针大小为12个字节;否则单个指针大小为4字节。
在GCC中,类成员函数指针不随基类的变化而变化,单个指针大小均为8个字节。
- 类成员函数大小问题
- 成员函数“指针”的大小
- 测试成员函数指针大小
- 关于类得数据成员的大小问题。求解。
- C++回顾之static成员、static成员函数及类对象大小计算
- 十二、对象的使用(一) static成员变量、static成员函数、类/对象大小计算
- C++回顾之static成员、static成员函数及类对象大小计算
- 类函数成员地址的注意问题 [**]
- 类模板成员函数的调用问题
- c++类成员函数内存分配问题
- 模版类的成员函数定义问题
- 类的static成员函数问题
- 类中成员函数调用问题
- 静态成员函数问题
- static数据成员、成员函数的问题
- static数据成员、成员函数的问题
- static数据成员、成员函数的问题
- 向普通函数传递类成员函数指针的问题
- 好生意一年历程(5/10)
- MFC钩子简单应用
- sockaddr与sockaddr_in结构体简介
- struts2对对象的强大支持
- 小制作- -炫彩水晶钟 TOM搬家
- 类成员函数大小问题
- delphi中如何让主窗体在程序运行之初不显示
- 两道算法题
- 函数调用约定( __cdecl + __stdcal + __fastcall )
- cudaMallocPitch()使用
- cTex——cls文件的使用方法
- 学习SqlDataAdapter——【之二】
- 几本不错的SOA书籍
- linux下实现多线程同步(一)