搜尋

首頁  >  問答  >  主體

c++ - 内存模型虚函数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的地址时提示错误。
黄舟黄舟2803 天前552

全部回覆(2)我來回復

  • 大家讲道理

    大家讲道理2017-04-17 13:06:02

    在類別中,如果什麼都沒有,則類別佔用1個位元組,一旦類別中有其他的佔用空間成員,則這1個位元組就不在計算之內,如一個類別只有一個int則佔用4位元組而不是5位元組。
    如果只有成員函數,還是只佔用1個字節,因為類別函數不佔用空間虛擬函數因為存在一個虛擬函數表,需要4個位元組,資料成員物件如果為指標則為4位元組,注意有位元組對齊,如果為13位元組,則進位到16位元組空間。

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

    回覆
    0
  • 高洛峰

    高洛峰2017-04-17 13:06:02

    static需要在類別外部初始化,static變數在靜態儲存區,類別物件被分配在了堆疊空間

    回覆
    0
  • 取消回覆