C ++和QT4.5 - 正在通过用const int&矫枉过正? 是否在传递信号/插槽引用帮

2019-08-02 13:55发布

两个问题集于一身这里...

我有许多这是所谓的每帧多次用于实时视频处理应用功能。 通过参考以咨询有关常量和传中,函数有一个签名有点像这样

void processSomething(const int& value);

当我继续键入一些额外的角色,我想知道如果这是矫枉过正。

第二个问题,那么,在由基准通行的主题,QT的槽/信号机构内,并通过引用传递有助于防止对象的拷贝作为在正常函数调用?

Answer 1:

是的,这是矫枉过正,实际上会导致较慢的代码比如果您按值传递的int值。 一个int是四个字节; 基准(本质上是一个存储器地址)或者是还四个字节(32位机器上)或八个字节(64位机器上)。 所以,你可能确实需要更多的信息,传递给函数- ,另外,你必须取消引用该引用的开销。

如果你传递更大的东西比int,但是,它更有效地使用const引用,因为你可以通过,而不必复制整个物体只是四个或八个字节。

编辑关于Qt的:是的,如果时隙为一个常量引用的对象,则该原因是保存复制对象的开销。



Answer 2:

是的,通过引用传递有助于防止复制的对象。 但是,编译器可能会决定完全优化它,并insted的按值传递,如果它产生同样的效果。 这种优化通常是可能的,如果功能和来电的网站在相同的翻译单元,但一些编译器可以做更多全局优化 - 如果你愿意,你可以检查发出的程序集。

这就是为什么你真的不应该被引用,如果你关心性能通过基本类型,除非你真的有原因为何。 见有什么用传递常量引用原始类型的? 对于这个问题的讨论。



Answer 3:

首先 - 之间的区别

  • 空隙processSomething(const int的值&);
  • 空隙processSomething(int值);

是:通常const引用是通过使一个指针通过,另一件事是通过拷贝通过。 该呼叫(从呼叫者一侧)后的结果相等。 你传递给函数任何没有被调用改变。

在函数内部,你将不会看到任何(至少在一个int)任何差异。 在对象上,你只能使用过程中的const函数。

在性能方面 - 传递const引用为int可以(或者可以不)比较慢,这取决于编译和优化。 编译器可以(在理论上)优化const引用的逝去的传值,我不知道如果这样做虽然。 与指针合作,整数而不是值当然是慢。

有关更多信息,请参阅: 当使用指针,当不使用它们


阅读其他链接的文章后 - 编译器不能在多线程环境优化它拿走。 至少在一个MT-环境有betwenn const int的真正的差异与和int电话。 +1该链接。



文章来源: C++ and QT4.5 - is passing a const int& overkill? Does pass by reference helps in signals/slots?