这之间是否有任何有价值的性能差异:
int myFunction(const int &a) { return 2 + a; }
和此:
int myFunction(int a) { return 2 + a; }
据我所知,第二种方法将作为参数传递的变量的副本复制到新寄存器,这在asm代码中需要更多的指令。在这种情况下,这个函数被调用一千次并且性能至关重要,传递const引用而不是变量是否更好?
答案 0 :(得分:5)
如果您的编译器无法看到这两行代码具有相同的效果,那么它就是一块垃圾,您不应该使用它。
但你的论点是无稽之谈。以下是两者的天真实现:
1:int myFunction(const int &a) { return 2 + a; }
传递a
的地址。从该地址获取值。添加两个。归还。
2:int myFunction(int a) { return 2 + a; }
通过a
的值。添加两个。归还。
请注意,第二个操作可以避免两个操作 - 获取a
的地址,然后从该地址获取a
的值。更糟糕的是,第一个仅在a
存储在内存中时才有效,这意味着如果它不存在则必须存储在内存中。哎哟。
对于一秒钟只有一千个电话,它不会产生太大的影响。但是对于编译器可能无法一次看到所有内容的更复杂的情况,它的标准做法是通过" small"按价值类型。当额外间接的成本低于复制值的成本时,您只希望通过引用传递。
答案 1 :(得分:2)
对于通过值传递它们的小类型比传递const引用更有效,因为引用添加了一个间接级别。
对于小型类型的定义,您应该进行测量,但对于平台字大小的值(例如整数,浮点数),最好通过值传递。
答案 2 :(得分:1)
通常第二个函数定义比第一个更有效,因为在第一个函数定义中使用了对参数的间接引用。