C++のenum型データのサイズは?
2023-12-24 02:57:11
質問
これはC++の面接試験の問題で、宿題ではありません。
#include <iostream>
using namespace std;
enum months_t { january, february, march, april, may, june, july, august, september,
october, november, december} y2k;
int main ()
{
cout << "sizeof months_t is " << sizeof(months_t) << endl;
cout << "sizeof y2k is " << sizeof(y2k) << endl;
enum months_t1 { january, february, march, april, may, june, july, august,
september, october, november, december} y2k1;
cout << "sizeof months_t1 is " << sizeof(months_t1) << endl;
cout << "sizeof y2k1 is " << sizeof(y2k1) << endl;
}
出力します。
sizeof months_t は 4
sizeof y2k is 4
sizeof months_t1 is 4
sizeof y2k1 is 4
なぜサイズがすべて4バイトなのでしょうか?12 x 4 = 48 バイトではないのですか?
ユニオンエレメントが同じメモリ位置を占めるのは知っていますが、これはenumです。
どのように解決するのですか?
サイズが4バイトなのは
enum
として格納されるためです。
int
. 12個の値しかないので、本当は4ビットしか必要ないのですが、32ビットのマシンは32ビットの量を少ない量より効率的に処理します。
0 0 0 0 January
0 0 0 1 February
0 0 1 0 March
0 0 1 1 April
0 1 0 0 May
0 1 0 1 June
0 1 1 0 July
0 1 1 1 August
1 0 0 0 September
1 0 0 1 October
1 0 1 0 November
1 0 1 1 December
1 1 0 0 ** unused **
1 1 0 1 ** unused **
1 1 1 0 ** unused **
1 1 1 1 ** unused **
列挙型がない場合、月を表すのに生の整数を使いたくなるかもしれません。それはそれで効率的ですが、コードが読みづらくなってしまいます。enumを使えば、効率的なストレージと読みやすさを手に入れることができます。
関連
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】Enterキーを押して続行する
-
[解決済み] Java enumのメンバーを比較する:==またはequals()?
-
[解決済み] enumを列挙するには
-
[解決済み] intをenumにキャストするにはどうすればよいですか?
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] Javaで文字列値からenum値を取得する方法
-
[解決済み] C#でenumからint値を取得する
-
[解決済み] C#の[Flags]Enum属性の意味とは?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】構造体のベクター初期化について
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。