在 C++ 中,对于 long long
类型的函数入参,选择 long long val
还是 const long long& val
,主要取决于参数的大小 和是否需要避免复制开销。
一句话总结:
对于内置类型如
long long
,直接传值(long long val
)效率通常更高或至少一样好,推荐使用传值方式。
原因分析:
参数类型 | 开销 | 说明 |
---|---|---|
long long val |
直接值传递,拷贝 8 字节 | 编译器会将其压入寄存器(如 x64 架构中使用寄存器传参),效率高,调用代码清晰。 |
const long long& val |
传递引用(实际上是一个指针),加一次间接访问 | 虽然避免了拷贝,但增加了一次指针解引用操作,可能会引起缓存命中率下降。 |
什么时候使用 const long long&
?
- 当参数是大型对象 (例如:
std::string
,std::vector
, 自定义类等),为了避免拷贝开销。 - 当你希望保持函数签名一致性(例如模板中统一使用引用传递)。
- 当你明确要保持引用语义时(例如用于调试、或借助引用避免拷贝构造/移动构造等情况)。
实际建议:
参数类型 | 推荐传参方式 |
---|---|
内置类型(如 int , long long , double 等) |
✅ 传值 |
大型对象或资源类(如 std::string , std::vector , 自定义类) |
✅ const T& |
举例:
cpp
// 推荐写法:
void process(long long val); // ✅
void process(const long long& val); // ⛔️ 通常没必要
编译器优化提示:
现代编译器(如 GCC、Clang、MSVC)会对小对象传值做大量优化,例如传寄存器而不是内存指针,避免不必要的间接访问。对于 64-bit 架构,long long
正好是 8 字节,不会有性能瓶颈。
总结:
✅ 对于 long long
,使用 long long val
是更自然、高效的选择。使用 const long long&
没有性能优势,反而可能引入微小的间接访问开销。