gcc:如果我在C ++中返回std :: string,那么没有尾递归吗?

时间:2016-04-27 20:48:56

标签: c++ g++ compiler-optimization tail-recursion clang++

根据我在Write a recursive function that reverses the input string中的回答,我已经尝试使用{{3中的一些建议来查看g++ -O3% cat t2.cpp #include <iostream> #include <string> std::string rerev1(std::string s) { if (s.empty()) return s; return rerev1(s.substr(1)) + s[0]; } std::string rerev2(std::string s, std::string b = "") { if (s.empty()) return b; return rerev2(s.substr(1), s[0] + b); } int main() { std::cout << rerev1("testing") << std::endl; std::cout << rerev2("testing") << std::endl; } 是否会进行尾递归优化但是它看起来并不像任何尾递归优化那样。知道为什么吗?

这是否与C ++对象的创建和销毁方式有关?有没有办法让它发挥作用?

该计划:

% clang++ -Wall -O3 t2.cpp
% objdump --disassemble a.out | fgrep rerev | fgrep callq
  400d8f:       e8 ac ff ff ff          callq  400d40 <_Z6rerev1Ss>
  400fd1:       e8 5a ff ff ff          callq  400f30 <_Z6rerev2SsSs>
  401168:       e8 d3 fb ff ff          callq  400d40 <_Z6rerev1Ss>
  40128d:       e8 9e fc ff ff          callq  400f30 <_Z6rerev2SsSs>

% g++ -O3 t2.cpp
% objdump --disassemble a.out | fgrep rerev | fgrep callq
  400c93:       e8 28 02 00 00          callq  400ec0 <_Z6rerev1Ss>
  400cfa:       e8 11 03 00 00          callq  401010 <_Z6rerev2SsSs>
  400f25:       e8 96 ff ff ff          callq  400ec0 <_Z6rerev1Ss>
  4010ca:       e8 41 ff ff ff          callq  401010 <_Z6rerev2SsSs>

% clang++ -v
Debian clang version 3.0-6.2 (tags/RELEASE_30/final) (based on LLVM 3.0)
Target: x86_64-pc-linux-gnu
Thread model: posix

% g++ --version
g++ (Debian 4.7.2-5) 4.7.2
Copyright (C) 2012 Free Software Foundation, Inc.

测试(如果尾部递归优化已经进行,我预计只有一个函数的调用,而不是两个):

select *
from tableSales a
join tableStaff b on a.Staff_ID = b.Staff_ID
join tableNext c on b.Column = c.Column (you can also join to table a)

0 个答案:

没有答案