我正在嘗試使用C和Assembly(intelx8086)語言。Enum如何在C上分配內存?
我還使用一類我的一個朋友給我說,有一個
typedef enum data_10 {a=0,b=7,c=10,} data_10_type;
我想這個類按位工作(AKA構建它/摧毀它的部件)。我的問題是,「enum」需要多少內存?
我正在嘗試使用C和Assembly(intelx8086)語言。Enum如何在C上分配內存?
我還使用一類我的一個朋友給我說,有一個
typedef enum data_10 {a=0,b=7,c=10,} data_10_type;
我想這個類按位工作(AKA構建它/摧毀它的部件)。我的問題是,「enum」需要多少內存?
枚舉並沒有真正記憶;編譯器會理解它,編譯期間會使用正確的數字。這是一個int,其大小取決於您的系統。
爲什麼不打印它?
/* C99 */
#include <stdio.h>
typedef enum { a = 0, b = 7, c = 10 } data_10_type;
printf("%zu\n", sizeof(data_10_type));
在枚舉列表中的標識符聲明爲具有類型int
(C11§6.7.2.2枚舉符)常數,因此sizeof(data_10_type)
往往等於sizeof(int)
,但它是沒有必要的!
順便說一句,如果你想有一個位的大小,只需使用CHAR_BIT
常量(定義在<limits.h>
),這表明在一個字節中有多少位)。
/* C99 */
#include <limits.h>
#include <stdio.h>
typedef enum { a = 0, b = 7, c = 10 } data_10_type;
printf("%zu\n", sizeof(data_10_type) * CHAR_BIT);
雖然可能會發生變化,從編譯器的編譯器,enum
通常需要大小爲int
相同。但可以肯定的是,您始終可以使用sizeof(data_10_type);
+1尺寸。這是唯一安全,便攜的知道方法。 – sfstewman
這會告訴你一個體繫結構上一個編譯器的特定版本的大小。這不是面向未來的。 – NovaDenizen
@NovaDenizen只有打印一次並永久使用。最好將它存儲在一個變量中,並使用它來進行分配。 – Greyson
在C中,與int相同。在C++ 0x中,它可以基於基本類型或多或少。 – DCoder
[C中枚舉的大小是多少?](http://stackoverflow.com/questions/366017/what-is-the-size-of-an-enum-in-c) – DCoder
[Wikipedia ](http://en.wikipedia.org/wiki/Data_structure_alignment#Typical_alignment_of_C_structs_on_x86)有一些與您的任務相關的信息。 – NovaDenizen