做者:李春港
出處:http://www.javashuo.com/article/p-dcofdyqk-nx.htmlhtml
因爲C++項目中用了相對比較多的枚舉(enum),正常狀況下,枚舉變量都是佔用一個整形類型的大小,可是項目中枚舉(enum)只須要使用到一個字節的大小,由於是在嵌入式設備上執行的代碼,資源比較少,那麼若是枚舉都是按照int型大小來使用的話,這無疑是一種資源浪費。c++
因此就想有沒有一種辦法能夠控制枚舉(enum)佔用內存的辦法。所幸,經過查找資料,發現C++11的新特性恰好加入了控制枚舉大小的機制。那麼接下來咱們就來看看,枚舉(enum)在C++11標準有哪些變化?以及C和C++11中的枚舉(enum)有什麼區別?程序員
前面有說到,默認狀況下,枚舉enum的大小是一個整形類型的大小,可是整形類型有不少:int、long int、short int等,因此enum的大小仍是不能肯定的。在C中enum的大小是不能夠經過程序員顯式控制的,這個大小是編譯器根據咱們給枚舉(enum)賦值的大小來選擇合適的整數類型的。測試
下面舉個例子:優化
/***************************************************************************** ** Copyright © 2020 lcg. All rights reserved. ** File name: enum.c ** Description: 測試enum的特性 ** Author: lcg ** Version: 1.0 ** Date: 2020.12.08 *****************************************************************************/ #include <stdio.h> enum color1 { RED = 0, GREEN, BLUE }; enum color2 { GRAY = 0x1122334455, YELLOW, PURPLE }; int main(int argc, char *argv[]) { printf("enum color1: %d\n", sizeof(enum color1)); printf("enum color2: %d\n", sizeof(enum color2)); return 0; }
輸出結果:調試
enum color1: 4 enum color2: 8
咱們發現這兩個枚舉變量所佔用的大小是不同的,enum color2已經超過了4個字節,因此編譯器會根據實際值的大小來調整枚舉變量的大小。c++11
這就存在了一個弊端,當咱們定義的一個結構體裏面有枚舉變量的時候,當枚舉變量值變化的時候,那麼結構體的大小就有可能會跟着變化。在沒有給枚舉賦值的時候爲結構體申請了堆空間,後面若是給枚舉賦了一個超過4個字節的值,那麼這個時候結構體的實際大小就已經變化了,這樣咱們後面程序對該結構體進行操做時就會存在隱患。code
咱們繼續使用上面的例程來講明取值範圍:htm
/***************************************************************************** ** Copyright © 2020 lcg. All rights reserved. ** File name: enum.c ** Description: 測試enum的特性 ** Author: lcg ** Version: 1.1 ** Date: 2020.12.08 *****************************************************************************/ #include <stdio.h> enum color1 { RED = 0, GREEN, BLUE }; enum color2 { GRAY = 1, YELLOW, PURPLE }; int main(int argc, char *argv[]) { enum color1 myClolor1; myClolor1 = RED; printf("myClolor1: %d\n", myClolor1); myClolor1 = GRAY; printf("myClolor1: %d\n", myClolor1); myClolor1 = 10; printf("myClolor1: %d\n", myClolor1); return 0; }
輸出結果:blog
myClolor1: 0 myClolor1: 1 myClolor1: 10
能夠看到,在C下enum定義的變量能夠賦規定範圍外的值的,可是在C++11下這是不容許的。在C++11中編譯會不經過,是C++11對C中enum的優化。
在C++11中程序員就能夠對枚舉(enum)進行顯式控制其佔用內存的大小了,以下示例:
/***************************************************************************** ** Copyright © 2020 lcg. All rights reserved. ** File name: enum.cpp ** Description: 測試enum的特性 ** Author: lcg ** Version: 1.2 ** Date: 2020.12.08 *****************************************************************************/ #include <stdio.h> enum color1 : char { RED = 0, GREEN, BLUE }; enum color2 : int { GRAY = 1, YELLOW, PURPLE }; int main(int argc, char *argv[]) { printf("enum color1: %d\n", sizeof(enum color1)); printf("enum color2: %d\n", sizeof(enum color2)); return 0; }
輸出結果:
enum color1: 1 enum color2: 4
C++11這樣的特性就能夠很好地解決我在前言所說的那些狀況啦,能夠節省資源。
如上面2.2小節的程序若是在C++11的標準中編譯就會出現如下的報錯:
1.cpp:33:15: error: cannot convert ‘color2’ to ‘color1’ in assignment myClolor1 = GRAY; ^ 1.cpp:36:15: error: invalid conversion from ‘int’ to ‘color1’ [-fpermissive] myClolor1 = 10;
在C++11標準中,enum定義的變量是不能夠賦規定範圍外的值的。這樣爲後期的調試帶來了不少的便利之處。