1. 程式人生 > >列舉(enum)所佔空間

列舉(enum)所佔空間

列舉(enum)

列舉的定義:

enum LOG_LEVEL

{

    DBG,
    INF,
    WAR,
    ERR,
    FAT,
    ALL,
    OFF


};

void WriteInfor(LOG_LEVEL level)

{

  switch(level)

{

case DBG:

printf("%d\n",DBG);

......


}


}

上述定義的列舉型別,預設為DBG=0,INF=1,依次類推。

(1)列舉型別是實數型別,可以跟int型別相互轉換。 其所定義的常量子與列舉型別有同樣的可見性,即DBG等可以被列舉型別外面的程式碼所看到。列舉型別沒有名字限定作用。struct有名字限定作用。

(2)列舉型別所佔的空間

C++標準文件中是這樣說明的:“列舉型別的尺寸是以能夠容納最大列舉子的值的整數的尺寸”,同時標準中也說名了:“列舉型別中的列舉子的值必須要能夠用一個int型別表述”,也就是說,列舉型別的尺寸不能夠超過int型別的尺寸,但是是不是必須和int型別具有相同的尺寸呢?上面的標準已經說得很清楚了,只要能夠容納最大的列舉子的值的整數就可以了在VS2010中sizeof的值為4。

(3)列舉和int是否可以互換

列舉長度可能比int小,有些情況下最好不用互換。

enum EType { e1 = 0, e2, e3 };
EType val;
std::scanf( "%d", &val );

列舉型別變數的尺寸不一定和int型別相同,這樣一來我們採用%d就 是說將列舉型別變數val當作4位元組的int變數來看待並進行引數壓棧,而在某些編 譯器下sizeof( val )等於1位元組,這樣scanf函式就會將val變數地址中的後續的三 位元組地址也壓入棧中,並對其進行賦值,也許val變數後續的三個位元組的地址沒有 特殊含義可以被改寫(比如是位元組對齊的空地址空間),可能會認為他不會出現錯 誤,其實不然,在scanf函式呼叫結束後會進行棧清理,這樣一來會導致scanf函式 清理了過多的地址空間,從而破壞了外圍函式的棧指標的指向,從而必然會導致程 序執行時錯誤。

相關推薦

列舉enum空間

列舉(enum) 列舉的定義: enum LOG_LEVEL { DBG, INF, WAR, ERR, FAT, ALL, OFF }; void WriteInfor(LOG_LEVEL level)

C#列舉enum

列舉(enum)是什麼? 1.列舉型別宣告為一組相關的符號常數定義了一個型別名稱。列舉用於“多項選擇”場合,就是程式執行時從編譯時已經設定的固定數目的“選擇”中做出決定。 列舉型別(也稱為列舉)為定義一組可以賦給變數的命名整數常量提供了一種有效的方法。例如,假設您必須定義一個變數,該變數的值表示

Java列舉Enum的簡單使用

Java列舉(Enum)的簡單使用 public enum Test { SUCCESS("000000", "success"), FAILURE("100000", "failure"), ILLEARG("100001", "illegal argume

【C++】列舉enum

目錄 宣告和定義 常規使用方法 自定義列舉量的值 列舉的取值範圍(一般不用考慮) 列舉應用 改進後的列舉 原有列舉的問題 改進--強型別列舉 專案中的強型別列舉程式碼片段 參考 宣告和定義 enum enumType {Monday, Tuesda

Java 列舉enum之淺進淺出

Java在1.5新增了列舉型別,說白了它就是一種特殊的Class;只是它不可以任意的去new例項物件,它的例項物件在定義enum時,就需要定義好了,這樣也就限制了這個類的範圍;比較常用的就是用來替代 public static final宣告的靜態常量。 一

內部類 列舉enum基本屬性和使用詳解

☆☆☆內部類和列舉的使用解析 列舉創建於呼叫 一、內部類 概念: 一個類中又定義了一個完整的類結構。 被包含的類 稱為 內部類 類體中包含其他類的類 稱為 外部類 其他的類 稱為 外部其他類 1、分類 (一)成員內部類 特點:

【C#基礎】列舉Enum、結構體Struct、委託Delegate

1.列舉(Enum) 確定數量,確定取值。方向(東南西北),性別(男女) 語法:[public] enum 列舉名 {     值1,     值2,     值3,     

《高效能MySQL》筆記-列舉ENUM型別

有時候可以使用列舉列代替常用的字串型別。列舉列可以把一些不重複的字串儲存成一個預定義的集合。MySQL在儲存列舉時非常緊湊,會根據列表值的數量壓縮到一個或者兩個位元組中。MySQL在內部會將每個值在列表中的位置儲存為整數,並且在表的.frm檔案中儲存“數字-字串

C++11:強型別列舉enum

// C++11之前的enum型別是繼承C的,不溫不火; // C++11對enum動刀了,加強了型別檢查,推出強型別enum型別,眼前一亮 // 使用過QT 的都知道,早就應該這麼做了,用的很爽!! // 一、C中enum型別的侷限 // 1、非強型別作用域 enum

Java JDBC簡單入門之列舉Enum、泛型、反射、JDBC整合

簡介 JDBC(Java DataBase Connectivity,java資料庫連線)是一種用於執行SQL語句的Java API,可以為多種關係資料庫提供統一訪問,它由一組用J

PostgreSQL中的列舉型別Enum

    在PostgreSQL中,需要先使用create type 建立列舉型別。 1.建立列舉型別 create type week as enum('Sun','Mon','Tues','Wed','Thur','Fri','Sat'); 2.建立表 create

日常運維管理技巧三檢視程序資源 top

三、用top命令顯示程序所佔的系統資源 可以用top檢視具體的程序。 紅框框中的內容與之前的w命令,vmstat命令檢視的類似。 包括系統的負載情況,總共有多少任務,有多少執行的任務,有多少正在sleeping的任務。 說明CPU使用率很高,us長期在60%以上是

Android進階之將註解@IntDef @StringDef替代列舉enum

1 概述 Enum是java中一種包含固定常數的型別。當我們需要預先定義一些值,並限定範圍時,使用 Enum,來做到編寫和編譯都查錯。   Java的Enum的實質是特殊單例的靜態成員變數,可以在編寫器,編譯器做到各種靜態檢查防呆;在執行期,所有列舉類作為單例,全部載入到記憶體中。   

java的列舉型別enum例項

列舉型別   實際上是我們在jdk1.5之前定義的 public static final XXX的常量 注意: 1)如果打算自定義自己的方法,那麼必須在enum例項序列的最後新增一個分號,而且Java要求必須先定義enum例項 2)所有的列舉都繼承自java.lang

MyBtais整合Spring Boot整合,TypeHandler對列舉enum處理

概要 問題描述 我想用列舉類來表示使用者當前狀態,列舉類由 code 和 msg 組成,但我只想把 code 儲存到資料庫,查詢處理,能知道使用者當前狀態,這應該怎麼做呢?在 Spring 整合

面向對象封裝 命名空間 訪問修飾符等

制度 color return 重用 等級 部分 cnblogs 控制 turn 一、封裝 封裝,即隱藏對象的屬性和實現細節,僅對外公開接口,控制在程序中屬性的讀和修改的訪問級別;將抽象得到的數據和行為(或功能)相結合,形成一個有機的整體,也就是將數據與操作數據的源代碼進行

SpringMVC源代碼學習外傳xml命名空間的解析NamespaceHandler

java ee 都是 replace 請求處理流程 reader spring ces tor source 以下內容基於書:《看透SpringMVC-源代碼分析與實踐》 基本照搬。。。用於自己查閱備忘。 加上外傳關鍵字的是討論一些SpringMVC的特定類的使用方法,

AVA 8 :從永久區PermGen到元空間Metaspace

一個 功能 -h tof log 奇跡 學習 也會 itl 你註意到了嗎?JDK 8早期可訪問版本已經提供下載了,java 開發人員可以使用java 8 提供的新的語言和運行特性來做一些實驗。其中一個特性就是完全的移除永久代(Permanent Generation (Pe

C#枚舉enum、常量const和readonly

通過反射 false 註意 int 針對 美國 得到 通用方法 英語 const修飾的是(類)靜態常量,,其值是在編譯期間確定的readonly修飾的是動態常量。 A、C#中的const和readonly的區別 C#中定義常量有兩種方式,一種叫做靜態常量,使用“c

從永久代PermGen到元空間Metaspace

為什麼要做這個轉換?總結以下幾點原因: 1、字串存在永久代中,容易出現效能問題和記憶體溢位。 2、類及方法的資訊等比較難確定其大小,因此對於永久代的大小指定比較困難,太小容易出現永久代溢位,太大則容易導致老年代溢位。 3、永久代會為 GC 帶來不必