程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C++中enum的大小

C++中enum的大小

編輯:關於C語言
 

關於枚舉類型所占內存的大小,書裡對枚舉大小的定義是:sizeof枚舉是sizeof某類可以包含枚舉range的整型,並且不會大於sizeof(int)。也就是說枚舉大小不一定等於sizeof(int)。 
比如在一個sizeof(int)等於4的機器上,sizeof枚舉有可能是1或者4,但不會是8 。

要想強制enum等於一個固定長度,就要定義一個最大的長度放入enum定義中。

比如: 
typedef   enum   _D3DPOOL   { 
        D3DPOOL_DEFAULT   =   0, 
        D3DPOOL_MANAGED  =   1, 
        D3DPOOL_SYSTEMMEM  =   2, 
        D3DPOOL_SCRATCH  =   3, 
        FORCE_DWORD  =   0x7fffffff 
}   D3DPOOL; 

根據書裡描述,這個FORCE_DWORD成員的作用就是控制枚舉類型的range,從而強制讓sizeof枚舉為sizeof(FORCE_DWORD)。而這麼做的目的就是為了高效地32位尋址。 

但如果如下定義:

enum A

{

a1=0xffffffffffff

};

編譯器就會報錯——“枚舉超出了int范圍”。

但是我在vs中測試發現情況並不是完全像書上所說。如下:

enum A

{

a1=1

};

int _tmain(int argc, _TCHAR* argv[])

{

  printf("%d\n",sizeof(a1));//輸出4

}

運行結果是輸出4而不是1。所以我覺的這個實現應該和編譯器有關。

而且:

#pragma pack(1)

enum A

{

a1=1

};

#pragma pack()

輸出a1依然占四個字節。以上說明枚舉類型作為C的標准變量類型,其長度是不受編譯開關影響的,就如char類型無論如何pack,依然是單字節.但是,並非所有的編譯器都遵循C標准,或許是VC不標准,或許是BCB不標准. 

 

所以建議以後用到的變量盡量使用char或int來替代enum,以免帶來不必要的麻煩. 

 

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved