18

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

即写这样一个函数是不是很糟糕:

void f(const bool& b);

或者

void f(const char& c);

而不是:

void f(bool b);

或者

void f(char c);

我问的原因是我看不到在这些情况下传递引用的好处,但也许我遗漏了一些东西。

4

6 回答 6

23

它可能有点糟糕,或者根本没有效果(取决于原始值的存储位置、优化器的好坏以及它决定如何处理您的代码)。

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

因此,公认的做法是将原语作为值传递,因为它更有效。当然,尽管传递诸如引用之类的东西并不会真正破坏任何东西,除非您在循环内访问该值,否则可能甚至不会导致任何可测量的差异。

于 2012-08-13T10:38:59.073 回答
13

除了性能之外,实际上在某些情况下您会得到不同的行为。

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

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

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

int bar(const int& a) {
    a = 5; // compiler-error
}

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

于 2012-08-13T10:46:15.937 回答
2

一个原因是您想向其他程序员传达该值是恒定的,在某些情况下可能会更清楚,尽管const bool就足够了。

于 2012-08-13T10:40:36.320 回答
1

我认为传递内置类型更好,by value因为const reference它实际上更快。在通过引用传递的情况下,您需要创建一个引用(即获取地址),然后在使用变量时取消引用。在大多数情况下,无论如何它都会被编译器优化

于 2012-08-13T10:38:48.923 回答
0

这真的没关系,按值传递可以使代码更清晰,因此被认为是好的做法。

于 2012-08-13T10:38:40.200 回答
0

虽然理论上这不是一个好主意,因为引用通常是使用指针实现的。但是,尽管如此,每个合理的编译器都应该足够聪明,以识别基本类型的按常量引用和按值之间的语义差异。

如果您有某种模板化接口必须适用于复杂类型和基本类型,并且您不希望过多的专业化开销(最简单的示例:),那么您通常别无选择std::vector。但是,如果您有选择,那么应该首选按值传递基本类型。

于 2012-08-13T10:42:27.923 回答