sizeof操作符的一些例子


 例一:

#include <iostream>
using namespace std;

class A
{
public:
    char c;
};

class B
{
public:
    int a;
    short b;
};

class C
{
public:
    int a;
    short b;
    char c;
};

class D
{
public:
    int a;
    short b;
    char c;
    char d;
};

class E
{
public:
    int a;
    short b;
    char c;
    char d;
    char e;
};

int main()
{
    cout<< "sizeof(A) = " <<sizeof(A) << endl;
    cout<< "sizeof(B) = " <<sizeof(B) << endl;
    cout<< "sizeof(C) = " <<sizeof(C) << endl;
    cout<< "sizeof(D) = " <<sizeof(D) << endl;
    cout<< "sizeof(E) = " <<sizeof(E) << endl;
    return 0;
}
View Code

輸出:

這里是32位機器,sizeof(B)=8,sizeof(C)=8,sizeof(E)=12的原因是字節對齊,編譯器會在最末一個成員之后填充字節。

例二:

#include <iostream>
using namespace std;

class Base
{
public:
    Base(int x) : a(x)
    {}
    void print()
    {
        cout << "Base" << endl;
    }
private:
    int a;
};

class Derived : public Base
{
public:
    Derived(int x) : Base(x - 1), b(x)
    {}
    void print()
    {
        cout << "Derived" << endl;
    }
private:
    int b;
};

class A
{
public:
    A(int x) : a(x)
    {}
    virtual void print()
    {
        cout << "A" << endl;
    }
private:
    int a;
};

class B : public A
{
public:
    B(int x) : A(x - 1), b(x)
    {}
    virtual void print()
    {
        cout << "B" << endl;
    }
private:
    int b;
};

int main()
{
    cout<< "sizeof(Base) = " <<sizeof(Base) << endl;
    cout<< "sizeof(Derived) = " <<sizeof(Derived) << endl;
    cout<< "sizeof(A) = " <<sizeof(A) << endl;
    cout<< "sizeof(B) = " <<sizeof(B) << endl;
    return 0;
}
View Code

輸出:

sizeof(Base)=4,int占4字節,print()函數不占內存;

sizeof(Derived)=8,比Base多一個int成員;

sizeof(A)=8,int占4字節,但是含有虛函數,包含了一個隱含的虛表指針成員,占4字節,共計8字節;

sizeof(B)=12,比A多一個int成員,共計12字節;

這里可能會存在一個疑問:B中也存在一個指向虛函數表的指針,所以應該是16字節。

解釋:虛表指針(vptr)是作為對象的一部分存在於對象的空間中,一個類只有一個虛表指針,所以A中的虛表指針和B中的虛表指針是同一個,所以是12字節。

例三:

#include <iostream>
using namespace std;

class A
{
};

class B
{
};

class C : public A, public B
{
};

class D : virtual public A
{
};

class E : virtual public A, virtual public B
{
};

class F : public D
{
};

class G
{
public:
    int a;
    static int b;
};

int main()
{
    cout<< "sizeof(A) = " <<sizeof(A) << endl;
    cout<< "sizeof(B) = " <<sizeof(B) << endl;
    cout<< "sizeof(C) = " <<sizeof(C) << endl;
    cout<< "sizeof(D) = " <<sizeof(D) << endl;
    cout<< "sizeof(E) = " <<sizeof(E) << endl;
    cout<< "sizeof(F) = " <<sizeof(F) << endl;
    cout<< "sizeof(G) = " <<sizeof(G) << endl;
    return 0;
}
View Code

輸出:

sizeof(A) = 1,類A是空類,編譯器會安插一個char空類,標記它的每一個對象,因此為1字節;
sizeof(B) = 1,同上;
sizeof(C) = 1,類C多重繼承類A和類B,大小仍然為1字節;
sizeof(D) = 4,類D虛繼承自A,編譯器安插了一個指向父類的指針,大小為4字節;
sizeof(E) = 4,類E虛繼承自A和B,因此它有指向父類A和父類B的指針,加起來為8字節。注意:在GNU編譯器下編譯字節是4字節;
sizeof(F) = 4,類F繼承D,大小為4字節;
sizeof(G) = 4,類G有一個static成員,這個靜態成員不在類的實例中,而是像全局變量一樣在靜態存儲區中,被類G共享,所以只計算一個int成員,為4字節;

PS:如果在A中加入char a;

輸出:sizeof(D) = 8 sizeof(E) = 8 sizeof(F) = 8 ,理由是字節對齊。

例四:

#include <iostream>
using namespace std;

union u1
{
    double a;
    int b;
};

union u2
{
    char a[13];
    int b;
};

union u3
{
    char a[13];
    char b;
};

int main()
{
    cout<< "sizeof(u1) = " <<sizeof(u1) << endl;
    cout<< "sizeof(u2) = " <<sizeof(u2) << endl;
    cout<< "sizeof(u3) = " <<sizeof(u3) << endl;
    return 0;
}
View Code

輸出:

這里定義了三個聯合體。聯合體的大小取決於它所有成員中占用空間最大的一個成員的大小。對於符合數據類型,例如union,struct,class,對齊方式為成員中最大成員的對齊方式。

sizeof(u1) = 8,最大成員為double a,為8;
sizeof(u2) = 16,最大成員是char[13]的數組,但由於另一個成員int b,使u2的對齊方式變成4,所以u2的大小為4的倍數,所以占用的空間由13對齊成16;
sizeof(u3) = 13,最大成員是char[13]的數組,另一個成員char b,所以大小為13;

 

例五:(查看32位和64位機器字節大小)

#include <iostream>
using namespace std;

int main()
{
    cout<< "sizeof(char) = " <<sizeof(char) << endl;
        cout<< "sizeof(short) = " <<sizeof(short) << endl;
    cout<< "sizeof(int) = " << sizeof(int) <<endl;
    cout<< "sizeof(double) = " <<sizeof(double) << endl;
    cout<< "sizeof(long) = " <<sizeof(long) << endl;    
    cout<< "sizeof(longlong) = " <<sizeof(long long) << endl;
        
    cout<< "sizeof(void*) = " << sizeof(void*) <<endl;
    cout<< "sizeof(char*) = " << sizeof(char*) <<endl;
    
    cout<< "當前系統是sizeof(void*) * 8 = " << sizeof(void*)*8<<""<<endl;
    
    return 0;
}

32位輸出:

64位輸出:

sizeof(char) = 1
sizeof(short) = 2
sizeof(int) = 4
sizeof(double) = 8
sizeof(long) = 8
sizeof(longlong) = 8
sizeof(void*) = 8
sizeof(char*) = 8
當前系統是sizeof(void*) * 8 = 64位

說明:

1.long型變量在32位是4字節,64位是8字節

2.指針變量在32位是4字節,64位是8字節

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM