C++ sizeof

來源:互聯網
上載者:User

標籤:c++   sizeof   空類   記憶體對齊   虛函數   

C++各種類型的sizeof大小,先放測試代碼和測試結果(VS2013)。

#include <iostream>using namespace std;////////// 測試基礎類型 //////////int GetArraySize(char str[]){    return sizeof(str);}void TestSizeofBase(){    cout << "////////// 測試基礎類型 //////////" << endl;    char* pStr = "hello world";    char arrStr[] = "hello world";    cout << "char: " << sizeof(char) << endl;    cout << "short: " << sizeof(short) << endl;    cout << "int: " << sizeof(int) << endl;    cout << "float: " << sizeof(float) << endl;    cout << "double: " << sizeof(double) << endl;    cout << "char*: " << sizeof(pStr) << endl;    cout << "string: " << sizeof("hello world") << endl;    cout << "char[]: " << sizeof(arrStr) << endl;    cout << "char[] as param: " << sizeof(GetArraySize(arrStr)) << endl;    cout << endl;}//////////// 測試空類 ////////////class EmptyA{};class EmptyB : public EmptyA{};struct EmptyStruct{};void TestSizeofEmpty(){    cout << "//////////// 測試空類 ////////////" << endl;    cout << "EmptyA: " << sizeof(EmptyA) << endl;    cout << "EmptyB: " << sizeof(EmptyB) << endl;    cout << "EmptyStruct: " << sizeof(EmptyStruct) << endl;    cout << endl;}////////// 測試記憶體對齊 //////////class AlignA{    char a;};class AlignB{    char a;    short b;};class AlignC{    char a;    short b;    double c;};#pragma pack(1)class AlignD{    char a;    short b;    double c;};#pragma pack()void TestSizeofAlign(){    cout << "////////// 測試記憶體對齊 //////////" << endl;    cout << "AlignA: " << sizeof(AlignA) << endl;    cout << "AlignB: " << sizeof(AlignB) << endl;    cout << "AlignC: " << sizeof(AlignC) << endl;    cout << "AlignD: " << sizeof(AlignD) << endl;    cout << endl;}//////////// 測試多態 ////////////class VirtualA{    virtual void test();};class VirtualB{    virtual void test();    virtual void test2();};void VirtualB::test() {}void VirtualB::test2() {}class VirtualC{    char a;    virtual void test();    virtual void test2();};void TestSizeofVirtual(){    cout << "//////////// 測試多態 ////////////" << endl;    VirtualB objB;    cout << "VirtualA: " << sizeof(VirtualA) << endl;    cout << "VirtualB: " << sizeof(VirtualB) << endl;    cout << "VirtualB Object: " << sizeof(objB) << endl;    cout << "VirtualC: " << sizeof(VirtualC) << endl;    cout << endl;}void TestSizeof(){    TestSizeofBase();    TestSizeofEmpty();    TestSizeofAlign();    TestSizeofVirtual();}int main(int argc, char **argv){    TestSizeof();    getchar();    return 0;}
輸出結果

簡要說明

sizeof(GetArraySize(arrStr)) 4,是因為參數傳遞為形參時,把數組轉為了指標。
sizeof(空類) 1,是因為執行個體化類需要編譯器給它分配記憶體空間,不能分配為size為0的記憶體,所以編譯器預設分配了一個位元組,以便標記可能初始化的類執行個體,同時使空類佔用的空間也最少(即1位元組)。
記憶體對齊,對象的首地址能夠被其最寬基本類型成員的大小所整除;每個成員相對於結構體首地址的位移量(offset)都是成員大小的整數倍, 如有需要編譯器會在成員之間加上填充位元組(internal adding);總大小為最寬基本類型成員大小的整數倍。
虛函數,虛函數表指標,大小相當於sizeof(void *)。

C++ sizeof

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.