29

ここには2つの関連する質問があります。

A)列挙型はどのように実装されますか?たとえば、私がコードを持っている場合:

enum myType
{ 
   TYPE_1,
   TYPE_2
};

実際に何が起こっているのですか?TYPE_1とTYPE_2をintとして扱うことができることは知っていますが、実際には単なるintですか?

B)その情報に基づいて、渡された列挙型を変更する必要がないと仮定すると、myTypeを値またはconst参照として関数に渡す方が理にかなっていますか?

たとえば、どちらがより良い選択です:

void myFunction(myType x){ // some stuff }

また

void myFunction(const myType& x) { // some stuff }
4

5 に答える 5

26

速度に関しては、ほぼ確実に問題ではありません。適切なC ++コンパイラは、単一のintを渡すだけです。

重要な点は読みやすさです-それはあなたのコードを読者にとってより明白にするでしょう?

これらの列挙型が実際には単なるintであることが明らかな場合は、intであるかのように値で渡します。const refを使用すると、プログラマーは2度考えてしまう可能性があります(決して良い考えではありません!)

ただし、後でそれらをクラスに置き換える場合は、APIを同じに保ち、定数を適用することが理にかなっている場合があります。

于 2011-07-26T18:18:05.250 に答える
13

C ++標準(§7.2/ 5)は、列挙型の基になる型が、列挙型で定義されたすべての列挙型値を表すことができる整数型であることを保証します。したがって、値で渡し、コードを可能な限り洗練されたものにしないでください。

于 2011-07-26T18:25:31.300 に答える
3

TYPE_1とTYPE_2をintとして扱うことができることは知っていますが、実際には単なるintですか?

はい。それらは一体型であり、おそらくintそれが最も自然な型であるという理由だけでそれらの型です。したがって、値を渡すことができます。参照を渡すことはあなたに重要な利点を与えません。

ちなみに、参考までに、§7.2/5のセクションには次のように書かれています。

列挙型の基になる型は、列挙型で定義されたすべての列挙型値を表すことができる整数型です。列挙型の基になる型として使用される整数型は 実装によって定義されます。ただし、列挙子の値がintまたはunsigned intに収まらない場合を除き、基になる型はintより大きくてはなりません。enumerator-listが空の場合、基になる型は、列挙型に値0の単一の列挙型があるかのようになります。列挙型、列挙型のオブジェクト、または列挙型に適用されるsizeof()の値は、 sizeof()は、基になる型に適用されます。

于 2011-07-26T18:25:05.853 に答える
2

組み込みの単純型(char、short、int、enum、float、pointers)を値で渡します

列挙型は整数として実装され、明示的に値を指定することもできます。

于 2011-07-26T18:17:38.540 に答える
0
typedef enum
{
    FIRST_THING,
    SECOND_THING
} myType;

次に、intのように使用します。値で渡します。

于 2011-07-26T18:19:01.410 に答える