内存模型虚函数static变量相关问题

32位机器,sizeof(cTest)=?

class CTest
{
    public:
        CTest():m_chData(‘\0’),m_nData(0)
        {
        }
        virtual void mem_fun(){}
    private:
        char m_chData;
        int m_nData;
        static char s_chData;
};

我的分析如下:
由于有虚函数,所以虚函数指针占4个字节,然后char占一个字节,按4字节对齐,补三位,int 占4个字节 最后static占4个字节。可是运行结果却不是16。
这是什么原因呢?

我在电脑上试图打出CTest类里每个对象的地址,s_chData的地址如何查看呢?
我的代码如下:

int main()
{
    CTest example;
    cout<<&example<<endl;
    cout<<&(example.m_chData)<<endl;
    cout<<&(example.m_nData)<<endl;
    
    return 0;
}
输出结果

0x7fff5fbff7a8

0x7fff5fbff7b4
中间有一个空行,然后试图输出s_chData的地址时提示错误。
阅读 3.1k
2 个回答

在类中,如果什么都没有,则类占用1个字节,一旦类中有其他的占用空间成员,则这1个字节就不在计算之内,如一个类只有一个int则占用4字节而不是5字节。
如果只有成员函数,则还是只占用1个字节,因为类函数不占用空间虚函数因为存在一个虚函数表,需要4个字节,数据成员对象如果为指针则为4字节,注意有字节对齐,如果为13字节,则进位到16字节空间。

class Empty
{
};

sieof(Empty)=1
如果是
class Empty
{
    public:
    virtual foo();
};
sizeof(Empty)=指针大小

static需要在类外部初始化,static变量在静态存储区,类对象被分配在了栈空间

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题