Call by Reference机制在递归程序中是否可起到性能优化作用?
问题结论
你对字符串用引用的优化效果要分两个参数分别看:
- 针对只读参数
s:引用传递确实起到了明显的优化作用
如果把s改为值传递,每一层递归调用都会完整拷贝一次整个字符串,假设字符串长度为n,递归深度为n,仅拷贝s的总时间开销就达到O(n²),字符串越长性能损耗越严重。你用引用传递完全避免了这部分无意义的拷贝,优化是有效的。更规范的写法是将参数声明为const string &s,明确表示s为只读参数,也能避免误修改。 - 针对写入参数
x:你当前的写法优化作用非常有限,还存在隐性问题
你代码中拼接字符串用的是x = x + s[indexToExtract],x + 单个字符的操作本身就会生成一个新的临时字符串对象,再把这个临时对象赋值给原x,这一步的开销和值传递时拷贝x的开销差异很小。只有把拼接逻辑改成x += s[indexToExtract],才能真正利用引用的优势:直接在原x对象的末尾追加字符,不需要生成临时对象,也不需要每层递归拷贝x,这时候性能才会有明显提升。
另外你用非常量引用传x的话,所有递归修改的都是main函数里传入的原始字符串对象,递归结束后main里的y已经被改成了s的倒序内容,如果你后续还要使用y的初始值就会出现逻辑bug,属于代码设计上的不严谨。
内容的提问来源于stack exchange,提问作者Aryaman
相关产品推荐
相关产品推荐

