在C++中,通过引用传递常量布尔值是不是不好的
In C++, is it bad to pass a const bool by reference?
在实际环境中,使用 gcc 或 MS Visual Studio,通过常量引用传递大小相同或小于 int 的值类型不好吗?
即编写这样的函数不好吗:
void f(const bool& b);
或
void f(const char& c);
而不是:
void f(bool b);
或
void f(char c);
我问的原因是,在这些情况下,我没有看到传递引用的好处,但也许我错过了一些东西。
它可能有点糟糕,或者可能根本没有影响(取决于原始值的存储位置、优化器的好坏以及它决定如何处理您的代码)。
该标准没有规定如何实现引用,但实际上编译器使用指针实现引用。因此,在一般情况下,bool&
将使用bool*
来实现,这意味着要访问bool
,您每次都需要一个额外的指针取消引用。由于bool
不大于指针,因此不会减少内存占用或减少字节复制来抵消此缺点。
因此,公认的做法是将基元作为值传递,因为它更有效。当然,尽管作为引用传递不会真正破坏任何东西,除非您访问循环中的值,否则甚至可能不会产生任何可测量的差异。
撇开性能不谈,实际上在某些情况下,你会得到不同的行为。
例如,传递const
引用可确保函数无法更改引用变量的值,但另一个线程可能会这样做。如果通过引用传递(即使使用 const
),您将看到这些更改,如果按值传递,则不会。
此外,接口的定义限制了您可以对函数内的变量执行的操作。请考虑以下示例:
int foo(int a) {
a = 5; // valid
}
int bar(const int& a) {
a = 5; // compiler-error
}
如果通过引用传递,并且想要修改变量的值以供本地使用,则需要创建额外的副本。如果按值传递,则已有一个副本。
一个原因是你想向其他程序员传达这个值是恒定的,在某些情况下,它可能更清楚,尽管const bool
就足够了。
传递内置类型by value
而不是const reference
,因为它实际上更快。在通过引用传递的情况下,您需要创建一个引用(即获取地址),然后在使用变量时取消引用。在大多数情况下,无论如何它都会由编译器优化
这真的没关系,传递值会使代码更清晰,因此被认为是很好的做法。
尽管理论上这不是一个好主意,因为引用通常是使用指针实现的。但是,每个合理的编译器都应该足够聪明,能够认识到基本类型的 by-const-reference 和 by-value 之间的语义差异。
如果你有某种模板化的接口,必须适用于复杂类型和基本类型,并且你不希望过多的专用化开销(最简单的例子:std::vector
),你通常别无选择。但是,如果您有选择,那么按值传递基本类型应该是首选。
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 变量定义到C++布尔值转换
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 重载更少,则运算符返回相反的布尔值
- 将此布尔值传递给此函数的最有效方法是什么?
- 如何设置 c++ 类的布尔值?
- 使用 MAKEWORD / MAKEWPARAM 使用布尔值而不是布尔值
- 将 10 个线程与原子布尔值同步
- 创建类似于布尔值的变量类型
- 布尔值向量的基于范围 for 循环
- 零点和布尔值之间的比较
- 简化对两个布尔值的 4 个 if/else 检查
- 无法创建带有布尔值和矢量的地图
- 对于完成布尔值设置为 true 后未停止的循环
- fstream / ifstream / ofstream 对象如何转换为布尔值
- 从常量字符串到布尔值的隐式强制转换
- 避免或警告在 GCC 中从常量字符* 隐式转换为布尔值
- 在C++中,通过引用传递常量布尔值是不是不好的
- 匹配布尔值与常量 void* 重载的函数地址
- 返回“常量布尔值”会导致警告 C4180