由于它被称为'类',我通常将它作为const引用传递给它,但是如果我使用普通的枚举它没有区别对吗?如果我将枚举类作为value / const ref传递,那么它会有所不同吗? 此外,类型是否重要?例如,枚举类:int
答案 0 :(得分:11)
enum class
保存一个整数值,就像常规enum
一样,因此您可以安全地按值传递它而不会产生任何开销。请注意,编译器有时可以通过引用来优化传递,也可以使用pass by value替换它。但是,当没有应用这样的优化时,通过引用传递可能会导致一些开销。
答案 1 :(得分:4)
作为一个非常宽泛的经验法则,将普通旧数据类型作为值传递,将类实例作为const
引用传递。
这条规则有例外;事实上,现在的趋势是在构建复制构造函数时依赖于按值传递,然后依赖移动语义。
对于C ++ 11的新enum class
内容,按值传递(毕竟它只包含一个整数类型)并且信任编译器以进行优化
如果您有任何疑问,个人资料任何性能差异。
答案 2 :(得分:2)
通过引用传递实际上是通过指针传递。仅仅因为对该项目的特定引用是不变的,并不意味着它不能被更改。它只是无法通过该引用进行更改。内存位置可能会被其他引用更改。
因此,const引用与传递值本身之间存在真正的语义差异。
如果这个语义没有为你正在编写的内容发挥作用,并且你试图通过const引用而不是为了避免复制而通过值传递,这不适用于整数或枚举(无论如何)你的枚举上的“类”标签)你真的只是通过指针来减慢速度。
答案 3 :(得分:1)
"平原"枚举和枚举类对象都是整数类型,因此通过const引用或值传递的决定与对整数类型的其他参数所做的决定相同。
如果这一个或另一个更好"取决于你想要达到的目标,持有对象的引用或获取它的副本不仅是空间的主题,还是"性能"。请注意,存储对象的(const)引用会反映在任何其他位置对此对象所做的更改,而存储对象的副本则不会。
所以:主要从视角决定"通过引用传递是否在语义上是正确的"。如果您遇到内存/性能问题,请在无意中更改语义之前使用您的探查器并进行测量。
无论如何,从内存或性能的角度来看,我认为引用通常会引入一些(可能非常小的)开销,因为访问实际值意味着额外的间接。
从内存的角度来看,当{"指针&#34}时,int
通常是4个字节。 (或引用)由8个字节表示。但我认为这在函数参数中不应该太大,除非你在具有非常高的递归深度的递归函数中有许多这样的参数。
此外,枚举类可以定义其基础数据类型,例如作为unsigned char
,虽然我仍然不认为这在用作函数参数时会产生很大的差异。
enum class ColorsEnumClass : unsigned char {
red,
green,
blue
};
答案 4 :(得分:0)
通常,传递值会导致复制对象,而通过引用传递会避免这种情况。当然,移动语义可以提供帮助。
所以是的,有区别。
答案 5 :(得分:-4)
是的,情况有所不同。当您传递值时,您正在创建该值的副本,而当通过引用传递时,编译器将指向原始数据。但优化编译器可以做一些技巧,因为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
}
我可以想到一个场景,其中枚举类型很重要。当您尝试优化空间时,减少枚举大小可能会有所不同。