C - 最好将枚举类作为值或const引用
C++ - Is it better to pass a enum class as value or const reference?
因为它称为'类',所以我通常会作为const引用将其传递,但是如果我使用普通的枚举,那没有区别吗?那么,如果我将枚举类作为Value/Const Ref,这会有所作为吗?另外,类型重要吗?例如,枚举类:int
enum class
像常规enum
一样具有积分值,因此您可以通过值安全地传递它而无需任何开销。请注意,编译器有时也可以通过参考来优化通过,以通过值替换为。但是,当不应用这种优化时,通过参考通过参考可能会导致一些开销。
作为非常广泛的经验法则,将普通的旧数据类型作为值传递,将类实例作为const
参考。
此规则有例外;实际上,如今的趋势喜欢按价值依靠通行
对于新的enum class
C 11的内容,按值将其传递(毕竟它仅在引擎盖下保持整体类型(,并相信编译器以进行优化。
如果您有任何疑问,请介绍任何性能差异。
通过参考通过指针有效通过。仅仅因为对项目的具体引用是恒定的,并不意味着它不能更改。它只是无法通过该参考来更改。内存位置可以通过其他引用更改。
因此,const参考和传递值本身之间存在真正的语义差异。
如果这种语义没有用于您所写的内容,而您正在尝试通过const参考而不是通过值来避免副本,则这不适用于整数或枚举之类的东西(无论如何枚举上的"类"标签(。您实际上只是通过通过指针来使事情变慢。
" plain"枚举和枚举类对象都是积分类型,因此通过const reference或value的决定与您对其他积分类型的参数相同。
如果一个或另一个是"更好"的取决于您想要实现的目标,并且对对象进行引用或获得该对象的副本不仅是空间或"性能"的主题。请注意,存储对象的(const(反映在任何其他位置对该对象进行的更改,而存储对象的副本则不会。
so:主要从角度来决定"通过引用在语义上是正确的"。如果您在内存/性能方面遇到麻烦,请在不知不觉地更改语义之前使用您的剖面和测量。
无论如何,从内存或性能的角度来看,我认为参考通常会引入一些(可能很小(的开销,因为访问实际值意味着附加的间接。
从内存的角度来看,当"指针"(或引用(由8个字节表示时,int
的s通常是4个字节。但是我认为,除非您在递归功能中有很多这样的论点,否则这在函数论点中不应对此进行太大影响。
此外,枚举类可以定义其基本数据类型,例如作为unsigned char
,尽管我仍然认为当用作函数参数时,这会差异很大。
enum class ColorsEnumClass : unsigned char {
red,
green,
blue
};
通常,通过值传递会导致复制对象,而通过参考文献则避免了。当然,移动语义可以提供帮助。
是的,是有区别的。
是的,它不同。当您按值传递时,您将创建该值的副本,而通过参考编译器传递时,您将指向原始数据。但是,优化编译器可以做一些技巧,因为基础数据类型对于枚举和枚举类都是INT。因此,在这里应用与int相同的规则
并且在编译时枚举和枚举类之间存在相当大的差异。虽然枚举只是数字,而您可以轻松地将枚举与不同的枚举甚至其他类型混合在一起。使用Enum类,您可以将类型全部检查。考虑以下代码
enum class light_color {red, yellow, green};
enum class car_color {red, yellow, green};
void myFunc(car_color) {}
int main() {
myFunc(car_color::red); // this one will compile fine
myFunc(light_color::red); // this one will give you error at compile time
}
我可以想到一种情况,枚举类型将很重要。当您尝试优化空间时,减少枚举大小可能会有所不同。
- 将const引用参数初始化为默认参数会导致悬空引用吗
- 为什么当我为 for(auto& it : myUnorderedMap) {... = std::move(it.second)} 时,我会得到一个 const 引用?
- 将对象传递给函数而不将其包装到 std::ref 中,而参数被指定为 const 引用
- 如何在构造函数中传递 const 引用时强制编译器不接受右值
- 为什么我需要三个嵌套的大括号来调用赋值运算符,将const引用到二维数组
- 对临时对象的Const引用不会延长其生存期
- 对 const 引用参数使用默认值会导致崩溃
- 在运算符重载中使用带有 const 引用的 friend 函数
- C++通过 const 引用传递时不调用派生类函数
- 具有字符串文本构造函数的类不适用于 const 引用初始化
- 为什么要返回对小类成员的 const 引用?
- C - 最好将枚举类作为值或const引用
- RVO:返回由值传递的值,即使显式分配给 const 引用也是如此
- const引用与可变成员的对象
- 每当传递lvalue时,每当通过rvalue传递时,将const引用存储
- 对类成员而不是 getter 的 Const 引用
- 从类型 'Matrix&' 的右值初始化 类型的非 const 引用无效 'Matrix'
- 在函数中使用 const 引用参数访问函数中成员的最佳实践 C++.
- STD ::配对的const引用如何工作
- 为什么我的C 函数拒绝返回const引用