在 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 double
是 double
的别名。 C++ 仅规定它必须至少与double
一样大,但可以更大。
imho Real
具有高度误导性,因为 long double
没有正确建模实数
任何合理的实现都会在适当的寄存器中传递值。
【参考方案1】:
我希望您的同事出于另一个原因编写它,即它阻止了在函数调用站点进行的任何隐式转换。它还可以防止函数体中的参数被修改,这有助于实现程序的稳定性,但这可以通过传递const
值来实现。
有时重载解决机制可能是有害的,尤其是在引入新的重载时。
如果它作为一种微优化策略存在,那么这是一件愚蠢的事情。如果您可以进行微优化,那么编译器也可以。并且写typedef long double Real;
仍然更愚蠢,因为(i)您已经将标准术语交换为专有术语,并且(ii)Real
意味着在可表示的数字中没有差距,我们知道情况并非如此。如果通过引用传递 long double
s 时,如果编译器将优化设置为最大值,则生成的代码运行速度更快,那么请考虑切换您的工具链。
(我使用过 128 位 long double
并始终按值传递。)
【讨论】:
这种微优化策略可能会更糟糕,就像别名一样,任何可能修改外部long double
的函数/方法(在func
内部)都会强制重新加载输入参数。跨度>
感谢您周到而全面的回答。我想知道,正如您提到的编译器可以进行微优化,这是否意味着编译器可以将按值调用参数自动切换为按引用调用。一?从用户的角度来看,这似乎是一个很大的行为变化。
@JimmyChen 见en.cppreference.com/w/cpp/language/as_if。只要不改变程序员的意图,编译器就可以为所欲为。以上是关于在 C++ 中,通过引用传递 const long double 是不是很好?的主要内容,如果未能解决你的问题,请参考以下文章
C++ 和 QT4.5 - 传递 const int& 过大?通过引用传递是不是有助于信号/插槽?
小白学习C++ 教程八在C++指针传递引用和Const关键字