C - 最好将枚举类作为值或const引用

C++ - Is it better to pass a enum class as value or const reference?

本文关键字:const 引用 枚举      更新时间:2023-10-16

因为它称为'类',所以我通常会作为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
}

我可以想到一种情况,枚举类型将很重要。当您尝试优化空间时,减少枚举大小可能会有所不同。