两个问题在这里合二为一……
对于实时视频处理应用程序,我有许多函数每帧被多次调用。接受关于 const 的建议并通过引用传递,函数的签名有点像这样
void processSomething(const int& value);
当我不断输入几个额外的字符时,我想知道这是否有点矫枉过正。
第二个问题,关于按引用传递的主题,在 QT 的槽/信号机制中,按引用传递是否有助于防止在正常函数调用中复制对象?
两个问题在这里合二为一……
对于实时视频处理应用程序,我有许多函数每帧被多次调用。接受关于 const 的建议并通过引用传递,函数的签名有点像这样
void processSomething(const int& value);
当我不断输入几个额外的字符时,我想知道这是否有点矫枉过正。
第二个问题,关于按引用传递的主题,在 QT 的槽/信号机制中,按引用传递是否有助于防止在正常函数调用中复制对象?
是的,这有点矫枉过正,实际上会导致代码比按值传递 int更慢。一个 int 是四个字节;引用(本质上是内存地址)或者也是四个字节(在 32 位机器上)或八个字节(在 64 位机器上)。因此,您实际上可能需要将更多信息传递给该函数——此外,您还有取消引用该引用的开销。
但是,如果您要传递比 int 更大的东西,使用 const 引用会更有效,因为您可以只传递 4 或 8 个字节,而不必复制整个对象。
关于 Qt 的编辑:是的,如果插槽采用对对象的 const 引用,那么这样做的原因是为了节省复制对象的开销。
是的,通过引用传递有助于防止复制对象。但是编译器可能会决定完全优化它,如果它产生相同的效果,则按值传递。如果函数和调用站点在同一个翻译单元中,这种优化通常是可能的,但是一些编译器可以做更多的全局优化——如果你关心的话,你可以检查发出的程序集。
这就是为什么你真的不应该通过引用传递原始类型,如果你关心性能并且除非你真的有理由这样做。请参阅将 const 引用传递给原始类型有什么用?讨论这个问题。
首先 - 之间的区别
是:通常一个 const 引用是通过传递指针传递的,另一件事是通过复制传递。调用后(从调用方),结果是相等的。调用不会更改您传递给函数的任何内容。
在函数内部,您也不会看到任何差异(至少在 int 上)。在对象上,您当然只能使用 const 函数。
在性能方面 - 将 const 引用传递给 int 可能(或可能不会)更慢,具体取决于编译器和优化。编译器可以(理论上)将 const 引用的传递优化为按值传递,但我不知道它是否确实如此。当然,使用指向整数而不是值的指针会更慢。
有关这方面的更多信息,请参阅: 何时使用指针,何时不使用它们
在阅读了其他链接的帖子后 - 编译器无法在多线程环境中对其进行优化。至少在 MT 环境中,const int& 和 int 调用之间存在真正的差异。为该链接+1。