在 C++ 中,通过引用传递 const long double 是不是很好?

Posted

技术标签:

【中文标题】在 C++ 中,通过引用传递 const long double 是不是很好?【英文标题】: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 没有正确建模实数 任何合理的实现都会在适当的寄存器中传递值。 【参考方案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。只要不改变程序员的意图,编译器就可以为所欲为。

以上是关于在 C++ 中,通过引用传递 const long double 是不是很好?的主要内容,如果未能解决你的问题,请参考以下文章

通过 const 引用传递对象?

C++ 通过常量引用传递和通过常量引用返回

C++ 和 QT4.5 - 传递 const int& 过大?通过引用传递是不是有助于信号/插槽?

小白学习C++ 教程八在C++指针传递引用和Const关键字

C++ 如何处理 const 标记的通过引用传递的类,这些类不是直接更改而是从另一端更改的? [复制]

C++ 使用const 引用传递参数