c/c++中的「大小,長度」問題

1.顯式緩衝區的sizeof和strlen

char buf[10] = 「hello」;
size_t a = sizeof(buf);
size_t b = strlen(buf);

a的值爲10,b的值爲5,這是由於sizeof(buf)計算的是字符數組的大小,strlen(buf)計算的是「hello」的長度。c++

2.隱式緩衝區的sizeof和strlen

char buf[] = 「hello」;
size_t a = sizeof(buf);
size_t b = strlen(buf);

a的值爲6,b的值爲5,這是由於buf的大小在編譯期就肯定了,它的大小恰好能保存字符串「hello」,而字符串默認後面還有一個’0’字符,它佔用一個字節,故sizeof(buf)是6,strlen(buf)爲5。數組

3.參數的sizeof(64位主機)

void fun(void * p, char data[10])
{
    size_t a = sizeof(p);
    size_t b = sizeof(data);
}

a的值爲8,b的值也是爲8,這是由於a爲指針,在64位主機中指針類型長度爲8個字節;而有人會疑問爲何b的大小不是10,而是8呢?在c/c++中傳遞數組參數時會退化成傳遞指針,這其實也很好理解,由於不必傳遞參數的時候全拷貝數組元素,那樣過低效了,傳遞數組頭指針便可,在函數經過數組頭指針就能夠訪問數組中的任意元素。函數

4.空類的sizeof

class Test
{
    //nothing.
};
Test t;
size_t a = sizeof(t);

a的值爲1,這是由於即便a是空類對象,它也須要經常使用存儲空間,而編譯器在這種狀況下給空類分配了一個字節,故大小爲1。測試

5.只有一個int32的類對象的sizeof

class Test
{
    int32_t m_data;
};
Test t;
size_t a = sizeof(t);

a的值爲4,這是由於Test再也不是一個空類,它的對象中存儲着一個int32_t的變量,故大小爲4。spa

6.在5的基礎上多一個普通成員函數的類對象的sizeof(64位主機)

class Test
{
    int32_t m_data;
    void fun(){};
};
Test t;
size_t a = sizeof(t);

a的值爲4,這是由於普通函數只是文本段(text段)中的一段執行代碼,由類的全部對象共享,不會佔用對象的空間,故此時類對象的大小仍是4。指針

7.在6的基礎上多一個虛成員函數的類對象的sizeof(64位主機)

class Test
{
    int32_t m_data;
    void fun(){};
    virtual fun_v(){};
};
Test t;
size_t a = sizeof(t);

a的值爲12,這是由於當類引入虛函數時,類對象中須要一個虛表指針來實現多態,在64位主機一個指針佔用8個字節,故類大小爲12。code

8.在7的基礎上多一個int32靜態成員變量的類對象的sizeof(64位主機)

class Test
{
    int32_t m_data;
    static int32_t m_static_data;
    void fun(){};
    virtual void fun_v(){};
};
Test t;
size_t a = sizeof(t);

a的值爲12,這是由於類的靜態成員變量是類共享的,不佔用類對象的空間,至關於c中靜態變量只是它被限定在類的命名空間(namespace)中,故類對象大小爲12。對象

9.在8的基礎上多一個靜態成員函數的類對象的sizeof(64位主機)

class Test
{
    int32_t m_data;
    static int32_t m_static_data;
    void fun(){};
    virtual void fun_v(){};
    static void fun_s(){};
};
Test t;
size_t a = sizeof(t);

a的值爲12,這是由於靜態成員函數和普通成員函數同樣是文本段(text段)中的一段執行代碼,不佔用類對象空間,被限定在類的命名空間中,故大小爲12。內存

10.注意點

若是你們寫測試demo驗證添加了虛函數後類對象的大小時可能獲得的大小不是12,而是16,這是由於此時類是以8字節(虛表指針的大小)對齊,此時只要在代碼中指定4字節對齊(#pragma pack(4)),類對象大小就是12,至於內存對齊的概念你們自行去百度吧。字符串

相關文章
相關標籤/搜索