<kbd id="daqct"></kbd>

  • <nav id="daqct"></nav>
    <wbr id="daqct"><pre id="daqct"></pre></wbr>
    <wbr id="daqct"></wbr>
    <form id="daqct"><th id="daqct"></th></form>
    更多課程 選擇中心

    C/C++培訓
    達內IT學院

    400-111-8989

    c/c++中的“大小,長度”問題

    • 發布:C++培訓
    • 來源:學習筆記
    • 時間:2017-04-10 17:00

    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”的長度。

    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。

    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。

    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,至于內存對齊的概念大家自行去百度吧。

    預約申請免費試聽課

    填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

    上一篇:用C++開發產品,需要注意哪些規范?
    下一篇:C語言中指針函數與函數指針的區別

    C語言創建windows窗口實例

    C++回調函數是什么?

    C++ shared_ptr和動態數組

    C語言有哪些關鍵詞,C語言44個關鍵詞大全

    • 掃碼領取資料

      回復關鍵字:視頻資料

      免費領取 達內課程視頻學習資料

    • 視頻學習QQ群

      添加QQ群:1143617948

      免費領取達內課程視頻學習資料

    Copyright ? 2021 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

    選擇城市和中心
    黑龍江省

    吉林省

    河北省

    湖南省

    貴州省

    云南省

    廣西省

    海南省

    欧美三级片,白洁外传,第四色播日韩AV第一页,啪啪免费观看大全av 百度 好搜 搜狗
    <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>