繁体   English   中英

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

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

因为它被称为'类',我通常会将它作为const引用传递给它,但是如果我使用普通的枚举,它没有任何区别对吗? 如果我将枚举类作为value / const ref传递,那么它会有所不同吗? 此外,类型是否重要? 例如,枚举类:int

enum class像常规enum一样保存一个整数值,因此您可以安全地按值传递它而不会产生任何开销。 请注意,编译器有时可以通过引用来优化传递,也可以使用pass by value替换它。 但是,当不应用这样的优化时,通过引用传递可能导致一些开销。

作为一个非常宽泛的经验法则,将普通旧数据类型作为值传递,将类实例作为const引用传递。

这条规则有例外; 事实上,现在的趋势是在构建复制构造函数时依赖于按值传递,然后是移动语义

对于C ++ 11的新enum class ,通过值传递它(毕竟它只包含一个整数类型)并且信任编译器进行优化。

如果您有任何疑问,请描述任何性能差异。

通过引用传递实际上是通过指针传递。 仅仅因为对该项目的特定引用是不变的,并不意味着它不能被更改。 它只是无法通过该引用进行更改。 内存位置可能会被其他引用更改。

因此,const引用与传递值本身之间存在真正的语义差异。

如果这个语义没有为你正在编写的内容发挥作用,并且你试图通过const引用而不是为了避免复制而通过值传递,这不适用于整数或枚举(不管“你的枚举上的“标签”。 你真的只是通过指针来减慢速度。

“普通”枚举和枚举类对象都是整数类型,因此通过const引用或值传递的决定与对整数类型的其他参数所做的决定相同。

如果一个或另一个“更好”取决于你想要实现的目标,并且持有对象的引用或获取它的副本不仅是空间或“性能”的主题。 请注意,存储对象的(const)引用会反映在任何其他位置对此对象所做的更改,而存储对象的副本则不会。

所以:主要从“通过引用传递是在语义上正确”的角度来决定。 如果您遇到内存/性能问题,请在无意中更改语义之前使用您的探查器并进行测量。

无论如何,从内存或性能的角度来看,我认为引用通常会引入一些(可能非常小的)开销,因为访问实际值意味着额外的间接。

从内存的角度来看,当“指针”(或引用)由8个字节表示时, int通常是4个字节。 但我认为这在函数参数中不应该太大,除非你在具有非常高的递归深度的递归函数中有许多这样的参数。

另外,枚举类可以定义它们的底层数据类型,例如作为unsigned char ,尽管我仍然认为当用作函数参数时这会产生很大的差异。

enum class ColorsEnumClass : unsigned char {
    red,
    green,
    blue
};

通常,传递值会导致复制对象,而通过引用传递会避免这种情况。 当然,移动语义可以提供帮助。

所以是的,有区别。

是的,它是不同的。 当您传递值时,您正在创建该值的副本,而当通过引用传递时,编译器将指向原始数据。 但优化编译器可以做一些技巧,因为enum和enum类的底层数据类型都是int。 所以这里应用与int相同的规则。
并且在编译时enum和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
}

我可以想到一个场景,其中枚举类型很重要。 当您尝试优化空间时,减少枚举大小可能会有所不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM