C++ 通过常数参考:性能提高?

C++ 通过常数参考:性能提高?,c++,performance,function,reference,constants,C++,Performance,Function,Reference,Constants,这两者之间是否存在有价值的性能差异: int myFunction(const int &a) { return 2 + a; } 这是: int myFunction(int a) { return 2 + a; } ? 据我所知,第二个方法将变量的副本作为参数传递到一个新的寄存器,这需要asm代码中的更多指令。在这种情况下,该函数每秒被调用数千次,性能至关重要,传递常量引用而不是变量是否更好?如果编译器看不到这两位代码具有相同的效果,那么这是一块垃圾,您不应该使用它 但你的论点是

这两者之间是否存在有价值的性能差异:

int myFunction(const int &a) { return 2 + a; }
这是:

int myFunction(int a) { return 2 + a; }
?


据我所知,第二个方法将变量的副本作为参数传递到一个新的寄存器,这需要asm代码中的更多指令。在这种情况下,该函数每秒被调用数千次,性能至关重要,传递常量引用而不是变量是否更好?

如果编译器看不到这两位代码具有相同的效果,那么这是一块垃圾,您不应该使用它

但你的论点是胡说八道。下面是这两种方法的简单实现:

1:int-myFunctionconst int&a{return 2+a;} 传递a的地址。从该地址获取值。再加上两个。归还它

2:int-myFunctionint-a{return 2+a;} 传递a的值。再加上两个。归还它

请注意,第二种方法避免了两种操作—获取a的地址,然后从该地址获取a的值。更糟糕的是,第一种方法只有在存储在内存中时才有效,这意味着如果它不在内存中,就必须将其存储在内存中。哎哟


一秒钟只打一千个电话,不会有多大区别。但对于编译器可能无法同时查看所有内容的更复杂的情况,标准做法是按值传递小类型。只有当额外间接寻址的成本小于复制值的成本时,您才希望通过引用进行传递。

通常,第二个函数定义比第一个函数定义更有效,因为在第一个函数定义中,使用了对参数的间接引用。

对于按值传递参数的小类型,可以更有效比通过常量引用传递有效,因为引用添加了一个间接级别


对于此处的小型类型的定义,您应该进行测量,但对于平台字号大小附近的值,例如ints、floats,您最好通过值进行传递。

您查过这个吗?你不是第一个问“这两者之间是否有任何有价值的性能差异”的人,这是不太可能的。事实上,一个好的优化编译器可能会像编写的那样内联这两个函数。否则,按引用传递通常使用指针实现,指针不小于Int,在64位系统中实际上更大。Bjarne说,对于内置类型,使用按值传递。如果性能至关重要,您可以更好地测试产品的性能,并在编译时启用优化标志。如果myFunction确实是一个瓶颈,那么您可以查看生成的机器代码,您可能会看到两个版本生成相同的内联代码。如果您的编译器看不到这两位代码具有相同的效果,那么这是一块垃圾,您不应该使用它。假设编译器可以在调用点看到函数体。它可能无法在真实代码中运行。@NeilKirk没错。对于更复杂的情况,你做这两件事中的哪一件肯定很重要。+1 dude即使从副本中的答案来看,这个答案也要好得多。通过价值和参考都是有效的,因为它们都具有预期的效果。