这可能是一个愚蠢的问题,但我注意到在许多API中,许多采用不打算修改的整数参数的方法签名如下所示:
void method(int x);
而不是:
void method(const int &x);
对我来说,看起来这两个功能完全相同.(编辑:显然不是在某些情况下,请参阅R Samuel Klatchko的回答)在前者中,价值被复制,因而无法改变原作.在后者中,传递了常量引用,因此原始文件无法更改.
我想知道的是为什么一个在另一个之上 - 是因为前者的表现基本相同甚至更好?例如,传递16位值或32位值而不是32位或64位地址?这是唯一合乎逻辑的理由我能想到的,我只是想知道这是否是正确的,如果不是,为什么以及何时应该更喜欢int x过const 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 &)
整数通常是处理器本机字的大小,可以轻松传递到寄存器中。从这个角度来说,值传递和常量引用传递没有区别。
如有疑问,请打印函数的汇编语言列表,以了解编译器如何传递参数。打印出按值传递和按常量引用传递。
此外,当按值传递时,该函数可以修改副本。当通过常量引用传递时,函数不能修改变量(它被标记为 const)。
| 归档时间: |
|
| 查看次数: |
18596 次 |
| 最近记录: |