运行时速度对比:指针多次调用类成员方法与声明变量哪个更快
两段代码的运行速度对比分析
核心结论:绝大多数场景下,案例2的速度不会比案例1慢,甚至可能更快,具体差异取决于MyClass::getLine()的实现逻辑:
情况1:getLine()返回缓存的字符串引用
如果getLine()的实现是直接返回类内部已有的std::string成员的引用(比如const std::string& getLine() const { return m_line; }),那么:
- 案例1会三次调用
getLine(),但每次只是获取一个引用,没有额外的字符串拷贝或内存分配,开销极低。 - 案例2会调用一次
getLine()并拷贝字符串到临时变量line,后续三次传递的是这个变量的引用(假设doSomething系列函数的参数是const std::string&),开销主要是一次字符串拷贝。
这种场景下两者的性能差异几乎可以忽略,案例1可能略快,但优势极小。
情况2:getLine()每次调用都会生成新字符串
如果getLine()的实现是每次调用都动态生成新的字符串(比如读取文件行、拼接动态内容,返回值是std::string而非引用),那么:
- 案例1会三次调用
getLine(),意味着三次字符串的创建、内存分配和销毁,总开销是案例2的三倍左右。 - 案例2只调用一次
getLine(),后续复用同一个字符串对象,开销远低于案例1,这种场景下案例2的速度优势非常明显。
额外建议:优先选择案例2的原因
除了性能层面的优势(或无劣势),案例2的代码还具备以下优点:
- 可读性更强:明确表达三次操作复用同一份字符串内容,逻辑更清晰。
- 避免潜在bug:如果
getLine()的返回值会随外部状态变化(比如每次调用读取下一行文件),案例1的三次调用会得到不同结果,而案例2能确保三次操作使用的是同一内容,符合代码的直观预期。
内容的提问来源于stack exchange,提问作者Mikel Grenlou
相关产品推荐
相关产品推荐

