将整数作为常量引用传递给复制

Jak*_*les 55 c++

这可能是一个愚蠢的问题,但我注意到在许多API中,许多采用不打算修改的整数参数的方法签名如下所示:

void method(int x);

而不是:

void method(const int &x);

对我来说,看起来这两个功能完全相同.(编辑:显然不是在某些情况下,请参阅R Samuel Klatchko的回答)在前者中,价值被复制,因而无法改变原作.在后者中,传递了常量引用,因此原始文件无法更改.

我想知道的是为什么一个在另一个之上 - 是因为前者的表现基本相同甚至更好?例如,传递16位值或32位值而不是32位或64位地址?这是唯一合乎逻辑的理由我能想到的,我只是想知道这是否是正确的,如果不是,为什么以及何时应该更喜欢int xconst int &x,反之亦然.

Ton*_*ony 57

它不仅仅是传递指针的成本(基本上是引用的成本),而且还在被调用方法的主体中取消引用以检索基础值.

这就是为什么传递一个intby值几乎可以保证更快(同样,编译器可以优化并简单地传递intvia处理器寄存器,从而无需将其推入堆栈).


R S*_*hko 37

对我来说,看起来这两个功能完全相同.

这取决于参考文献的确切内容.这是一个公认的组成示例,它将根据您是传递引用还是值来更改:

static int global_value = 0;

int doit(int x)
{
    ++global_value;
    return x + 1;
}

int main()
{
    return doit(global_value);
}
Run Code Online (Sandbox Code Playgroud)

此代码的行为会有所不同,具体取决于您是否拥有int doit(int)int doit(const int &)


Tho*_*ews 5

整数通常是处理器本机字的大小,可以轻松传递到寄存器中。从这个角度来说,值传递和常量引用传递没有区别。

如有疑问,请打印函数的汇编语言列表,以了解编译器如何传递参数。打印出按值传递和按常量引用传递。

此外,当按值传递时,该函数可以修改副本。当通过常量引用传递时,函数不能修改变量(它被标记为 const)。