在C++中,通过引用传递const bool是不是很糟糕?

Blu*_*rin 15 c++ gcc visual-studio

在实际环境中,使用gcc或MS Visual Studio,通过const引用传递大小相同或小于int的值类型是不是很糟糕?

即编写这样的函数是不好的:

void f(const bool& b);
Run Code Online (Sandbox Code Playgroud)

要么

void f(const char& c);
Run Code Online (Sandbox Code Playgroud)

而不是:

void f(bool b);
Run Code Online (Sandbox Code Playgroud)

要么

void f(char c);
Run Code Online (Sandbox Code Playgroud)

我问的原因是我没有看到在这些情况下传递参考的好处,但也许我错过了一些东西.

Jon*_*Jon 19

它可能稍微有点坏,或者它可能根本没有效果(取决于存储原始值的位置,优化程序有多好以及它如何决定处理代码).

该标准没有强制要求如何实现引用,但实际上编译器使用指针实现引用.因此,在一般情况下,bool&将使用a来实现bool*,这意味着bool每次访问时需要额外的指针取消引用.由于a bool不大于指针,因此不会减少内存占用或减少字节复制以抵消此缺点.

因此,公认的做法是将原语作为值传递,因为它更有效.当然,虽然传递这样的引用并不会真正炸毁任何东西,除非你在循环中访问值,否则可能甚至不会产生任何可衡量的差异.

  • @BlueTrin:占用多少空间取决于架构中`sizeof(bool)`和`sizeof(bool*)`的值.传递每个参数的倍数不会改变图片. (4认同)

Bjö*_*lex 11

除了性能之外,实际上您会遇到不同的行为.

例如,传递const引用可确保函数不能更改引用变量的值,但另一个线程可能会这样做.如果您通过引用传递(即使使用const),您将看到这些更改,如果您通过值传递,则不会.

此外,界面的定义限制了您可以对函数内部的变量执行的操作.考虑这个例子:

int foo(int a) {
    a = 5; // valid
}

int bar(const int& a) {
    a = 5; // compiler-error
}
Run Code Online (Sandbox Code Playgroud)

如果通过引用传递,并且要修改变量的值以供本地使用,则需要进行额外的复制.如果您按值传递,则表示您已经有副本.

  • 请注意,您不需要多个线程来更改引用的变量.你可以(例如)`bool b(false); void f(const bool&a){assert(!a); b =真; assert(a);} int main(){f(b);}`. (5认同)