char 類型的移植問題與C++類對象的sizeof()大小計算

來源:互聯網
上載者:User

1.在C語言中char型佔一個位元組的儲存空間,一個位元組是8個bit。如果這8個bit按不帶正負號的整數,取值範圍是0~255,如果按有符號整數,取值範圍是-128~127。C語言規定了signed和unsigned兩個關鍵字,unsigned char型表示無符號數,signed char型表示有符號數。
因此這裡的主要問題是,如果使用不帶signed或unsigned關鍵字的char型究竟是無符號數還是有符號數呢?C標準規定這是Implementation Defined,也就是說由編譯器自己定義實現。編譯器可以定義char型是無符號的,也可以定義char型是有符號的,比如x86平台的gcc定義char型是有符號的。當然其它平台的其它編譯器也可以定義為無符號型。
因此:

char tmp;
if(tmp<0){...}
else{...}
這樣的代碼,如果從將char定義為有符號的平台移植到將char定義為無符號類型的平台,tmp<0是永遠無法成立的。所以,會出現移植問題。

2.

class C
{
    public:
        C();
        void fn1();
        void fn2();
    protected:
        int a;
        int b;

C c;
sizeof(c)計算的應該是其中的資料成員的大小。函數屬於代碼,存放在代碼區而不是資料區,所有對象都共用一份代碼,但擁有自己獨自的資料。對於有繼承和多態關係的C++類對象中的資料成員分布,可以參考書中我書中C++一章,裡面有專門論述,也可以參考<effective c++>和<more effective c++>。也就是說,擁有多態關係的C++類對象,還擁有一份或多份指向虛函數表的指標或者虛基類的指標。因此計算對象的大小的時候,還必須加上指標占的空間。
下面的例子,你可以在VC6裡面編譯運行,實驗一下每個類對象的大小,你就明白了。
class A
{
    public:
        A();
        void fn1();
        void fn2();
    protected:
        int a;
        int b;

};
A::A()
{
 a = 0;
 b = 0;
}
class B:public A
{
public:
 B();
 void fn3();
 void fn4();
private:
 int c;
};
B::B():A()
{
 c = 0;
}
 
//C,D引入了虛函數,因此計算對象大小時,需要算上指向vtable的指標大小
class C
{
public:
 C();
 virtual void fn1();

 void fn2();
protected:
 int a;
 int b;

};
C::C()
{
 a = 0;
 b = 0;
}
void C::fn1()
{
 return;
}
class D:public C
{
public:
 D();
 virtual void fn1();
 void fn3();
 void fn4();
private:
 int c;
};
void D::fn1()
{
 printf("hello\n");
 return;
}
D::D():C()
{
 c = 0;
}
int main(int argc, char* argv[])
{
 C c;
 D d;
 printf("Hello World!:sizeof(A):%d, sizeof(B):%d, sizeof(c):%d, sizeof(d):%d\n", 
  sizeof(A), sizeof(B),sizeof(c), sizeof(d));
 return 0;
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.