【问题标题】:In C++, is it good to pass a const long double by reference?在 C++ 中,通过引用传递 const long double 是否很好?
【发布时间】:2021-11-26 11:56:00
【问题描述】:

我正面临着我的同事编写这样的函数定义:

    typedef long double Real;
    void func(const Real& x, const Real &y);

我知道对 primitive types 使用 pass-by-ref 有点不好,但是 long double 呢?它的长度是 80 位,比现在普通机器上的 64 位指针还要长。所以也许对于long double,pass-by-ref 比 pass-by-value 更有效?

【问题讨论】:

  • 请注意,long double 没有为 80(或任何其他数量)位。在某些编译器中,long doubledouble 的别名。 C++ 仅规定它必须至少double 一样大,但可以更大。
  • imho Real 具有高度误导性,因为 long double 没有正确建模实数
  • 任何合理的实现都会在适当的寄存器中传递值。

标签: c++


【解决方案1】:

我希望您的同事出于另一个原因编写它,即它阻止了在函数调用站点进行的任何隐式转换。它还可以防止函数体中的参数被修改,这有助于实现程序的稳定性,但这可以通过传递const值来实现。

有时重载解决机制可能是有害的,尤其是在引入新的重载时。

如果它作为一种微优化策略存在,那么这是一件愚蠢的事情。如果您可以进行微优化,那么编译器也可以。并且写typedef long double Real; 仍然更愚蠢,因为(i)您已经将标准术语交换为专有术语,并且(ii)Real 意味着在可表示的数字中没有差距,我们知道情况并非如此。如果通过引用传递 long doubles 时,如果编译器将优化设置为最大值,则生成的代码运行速度更快,那么请考虑切换您的工具链。

(我使用过 128 位 long double 并始终按值传递。)

【讨论】:

  • 这种微优化策略可能会更糟糕,就像别名一样,任何可能修改外部long double 的函数/方法(在func 内部)都会强制重新加载输入参数。跨度>
  • 感谢您周到而全面的回答。我想知道,正如您提到的编译器可以进行微优化,这是否意味着编译器可以将按值调用参数自动切换为按引用调用。一?从用户的角度来看,这似乎是一个很大的行为变化。
  • @JimmyChen 见en.cppreference.com/w/cpp/language/as_if。只要不改变程序员的意图,编译器就可以为所欲为。
猜你喜欢
  • 2012-08-09
  • 1970-01-01
  • 1970-01-01
  • 2012-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2016-09-05
相关资源
最近更新 更多