C++中基本类型按值传递比引用传递慢的原因咨询
基本类型传值与传引用的性能差异疑问
我了解到不少观点认为int这类基本类型按值传递比按引用传递更快,但编写的测试代码却出现相反结果:
按值传递的代码(平均耗时约2秒)
#include <iostream> #include <chrono> using namespace std; using namespace chrono; int func(unsigned long long x) { ++x; return x; } int main() { for (int b = 0; b < 5; b++) { unsigned long long x = 0; auto start = high_resolution_clock::now(); for (long long j = 0; j < 500000; j++) { for (long long i = 0; i < 180000000; i++) { x = func(x); } } auto stop = high_resolution_clock::now(); auto elapsed = std::chrono::high_resolution_clock::now() - start; long long microseconds = std::chrono::duration_cast<std::chrono::microseconds>(elapsed).count(); cout << x <<" iterations took " << microseconds << " microseconds\n"; } }
按引用传递的代码(平均耗时不足1微秒)
#include <iostream> #include <chrono> using namespace std; using namespace chrono; void func(unsigned long long& x) { ++x; } int main() { for (int b = 0; b < 5; b++) { unsigned long long x = 0; auto start = high_resolution_clock::now(); for (long long j = 0; j < 500000; j++) { for (long long i = 0; i < 180000000; i++) { func(x); } } auto stop = high_resolution_clock::now(); auto elapsed = std::chrono::high_resolution_clock::now() - start; long long microseconds = std::chrono::duration_cast<std::chrono::microseconds>(elapsed).count(); cout << x <<" Took " << microseconds << " microseconds\n"; } }
性能差异的核心原因
这种反常结果完全是编译器优化导致的,和传值/传引用本身的性能特性无关:
引用版本被完全优化:编译器能轻易识别出,整个嵌套循环的唯一作用就是把
x从0累加至500000 * 180000000。它会直接计算这个最终值,跳过所有循环执行,所以程序运行耗时几乎为0。传值版本的优化受限:虽然传值版本的逻辑结果和引用版本一致,但
x = func(x)的流程(传值副本→自增→返回赋值)让编译器的优化分析更复杂,没能完全消除循环。实际运行时它可能还是执行了部分循环逻辑,或者优化力度不如引用版本,导致耗时更长。测试场景不真实:这种极端的无副作用循环测试完全是编译器的“跑分陷阱”。在真实业务场景中,基本类型传值的开销通常比传引用小——因为引用本质是隐藏的指针,传递指针需要间接访问内存;而传值是直接把数据放到寄存器中操作,延迟更低、速度更快。
内容的提问来源于stack exchange,提问作者Joeger-Bahar
相关产品推荐
相关产品推荐

