在C++中,通过引用传递常量布尔值是不是不好的

In C++, is it bad to pass a const bool by reference?

本文关键字:布尔值 常量 是不是 C++ 引用      更新时间:2023-10-16

在实际环境中,使用 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),你通常别无选择。但是,如果您有选择,那么按值传递基本类型应该是首选。