C++:将枚举作为值传递还是作为常量引用传递更好
C++: Is it better to pass an enum as a value or as a const reference?
这里有两个相关的问题:
A( enum是如何实现的?例如,如果我有代码:
enum myType
{
TYPE_1,
TYPE_2
};
实际发生了什么?我知道你可以把TYPE_1和TYPE_2看作int,但它们实际上只是int吗?
B( 基于这些信息,假设传入的枚举不需要更改,那么将myType作为值或常量引用传递到函数中更有意义吗?
例如,哪个是更好的选择:
void myFunction(myType x){ // some stuff }
或
void myFunction(const myType& x) { // some stuff }
从速度上看,这几乎肯定无关紧要——任何一个像样的C++编译器都只会通过一个int。
重要的一点是可读性——这将使您的代码对读者更明显?
如果很明显,这些枚举实际上只是int,那么我会按值传递它们,就好像它们是int一样。使用const-ref可能会让程序员三思而后行(从来都不是一个好主意!(
然而,如果您稍后要用类替换它们,那么保持API不变并强制执行const-ness可能是有意义的。
C++标准(§7.2/5(保证枚举的底层类型是一个整数类型,它可以表示枚举中定义的所有枚举器值。因此,按值传递,不要让代码变得过于复杂。
我知道你可以把TYPE_1和TYPE_2看作int,但它们实际上只是int吗?
是的。它们是积分型,很可能它们的类型只是int
,因为这是最自然的类型。所以你可以通过价值传递;通过参考不会给你带来任何显著的优势。
顺便说一句,为了供您参考,§7.2/5节说,
枚举的基础类型是可以表示枚举中定义的所有枚举器值。是的实现定义使用哪个积分类型作为基础枚举的类型,但基础类型不应为大于int,除非枚举器的值不能容纳在int中或无符号int。如果枚举器列表为空,则基础类型就好像枚举有一个值为0的枚举器一样。这个sizeof((的值应用于枚举类型,该类型是枚举类型或枚举器是应用的sizeof((的值到基础类型。
通过值传递内置的简单类型(char、short、int、enum、float、指针(
枚举被实现为整数,您甚至可以显式地为它们指定值。
typedef enum
{
FIRST_THING,
SECOND_THING
} myType;
然后像使用int一样使用它。按值传递它。
- 什么时候在C++中返回常量引用是个好主意
- 通过常量引用传递参数的矩阵模板类
- 在C++中使用非常量引用作为常量
- 具有常量引用参数的函数模板专用化
- 多个"常量引用"变量可以共享同一个内存吗?
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 为什么常量方法可以采用非常量引用?
- 为什么当我们有常量引用时创建临时对象?
- 如何返回向量的常量引用?
- C++:常量引用参数
- 不同于按值传递和常量引用传递的程序集
- 为什么const_cast和static_cast常量引用没有效果?
- C++ 获取函数在常量引用中按值返回的结果
- 从 BubbleSort* 类型的右值初始化 'AssortedSorter&' 类型的非常量引用无效"
- C++ 在类中使用常量引用文本时 O2 内存泄漏
- 是否可以跨 dll 边界返回常量引用/指向 std::vectors?
- C++中大多数/所有 setter 函数的参数是否应该写为常量引用?
- 通过非常量引用参数修改常量引用参数
- 将常量引用传递给线程
- 为什么C++中没有常量引用,就像常量指针一样?