C ++:将枚举作为值或作为const引用传递是否更好?

时间:2011-07-26 18:15:50

标签: c++ enums performance const-reference

这里有两个相关的问题:

A)如何实现枚举?例如,如果我有代码:

enum myType
{ 
   TYPE_1,
   TYPE_2
};

实际发生了什么?我知道您可以将TYPE_1和TYPE_2视为整数,但实际上它们只是整数?

B)基于该信息,假设传入的枚举不需要更改,将myType作为值或const引用传递给函数会更有意义吗?

例如,哪个是更好的选择:

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

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

5 个答案:

答案 0 :(得分:17)

速度方面几乎肯定没关系 - 任何体面的C ++编译器都只会传递一个int。

重点是可读性 - 这将使您的代码对读者更明显?

如果很明显这些枚举真的只是整数,那么我会按价值传递它们,就好像它们是整数一样。使用const ref可能会导致程序员三思而行(绝不是个好主意!)

然而 - 如果你以后要用类替换它们,那么保持API相同并强制执行const-ness可能是有意义的。

答案 1 :(得分:8)

C ++标准(第7.2 / 5节)保证枚举的基础类型是一个整数类型,可以表示枚举中定义的所有枚举器值。因此,按值传递它,不要让你的代码更复杂。

答案 2 :(得分:1)

  

我知道您可以将TYPE_1和TYPE_2视为整数,但它们实际上只是整数?

是。它们是整数类型,很可能它们的类型只是int,因为这是最自然的类型。所以你可以通过价值;通过引用传递不会给你任何显着的优势。

顺便提一下,§7.2/ 5节说明了

供你参考
  

枚举的基础类型是可以的整数类型   表示枚举中定义的所有枚举器值。它是   实现定义的使用哪个整数类型作为底层   枚举的类型,但基础类型不应该是   大于int,除非枚举器的值不适合int   或unsigned int。如果枚举器列表为空,则为基础类型   好像枚举有一个值为0的枚举器   sizeof()的值应用于枚举类型,对象的   枚举类型或枚举器是应用的sizeof()的值   基础类型。

答案 3 :(得分:0)

按值传递内置的简单类型(char,short,int,enum,float,pointers)

枚举实现为整数,您甚至可以明确指定它们的值。

答案 4 :(得分:0)

typedef enum
{
    FIRST_THING,
    SECOND_THING
} myType;

然后像int一样使用它。按值传递。