在我看来,在C和C++中进行尾递归优化是完美的,但是在调试时我似乎永远不会看到表示此优化的帧堆栈.这有点好,因为堆栈告诉我递归的深度.但是,优化也会很好.
是否有任何C++编译器进行此优化?为什么?为什么不?
我如何告诉编译器这样做?
/O2
或/Ox
-O2
或-O3
如何在某种情况下检查编译器是否已完成此操作?
我仍然会建议如何确定编译器是否对某个函数进行了优化(尽管我发现它让人放心,Konrad告诉我假设它)
总是可以通过进行无限递归来检查编译器是否完成此操作,并检查它是否导致无限循环或堆栈溢出(我用GCC做了这个并且发现这-O2
已经足够了),但我想成为能够检查我知道的某个功能无论如何都会终止.我很想有一个简单的方法来检查这个:)
经过一些测试,我发现析构函数破坏了进行优化的可能性.有时可能值得更改某些变量和临时值的范围,以确保它们在return语句开始之前超出范围.
如果在尾调用后需要运行任何析构函数,则无法进行尾调用优化.
我想创建一个返回整数幂的函数.请阅读fmuecke 在c ++中的整数幂解决方案 .
但是,我想将他的解决方案推广到任意类型T.由于c ++ 11有constexpr,我想这是可能的.
天真,我尝试过类似的东西,
template<class T, int N>
inline constexpr T pow(const T x){
return pow<N-1>(x) * x;
}
template<class T>
inline constexpr T pow<T, 1>(const T x){
return x;
}
template<class T>
inline constexpr T pow<T, 0>(const T x){
return 1;
}
Run Code Online (Sandbox Code Playgroud)
实际上这种方法失败了,因为不允许对函数模板进行部分特化.
还有一个问题.我听说编译器是否在编译时评估constexpr函数是由编译器决定的.如何强制它计算一般类型.我从某处读到,对于整数consts来说,最简单的一个方法是将它包装在std :: integral_const :: value中.
这是关于这一点的后续问题:C++ 14中的Lambda-Over-Lambda,答案解释了代码.
它是关于lambda创建另一个lambda,在调用时,调用传递的lambda并将返回值传递给原始lambda,从而返回第二个lambda的新实例.
该示例显示了lambdas可以链接的方式.
复制原始问题:
#include <cstdio>
auto terminal = [](auto term) // <---------+
{ // |
return [=] (auto func) // | ???
{ // |
return terminal(func(term)); // >---------+
};
};
auto main() -> int
{
auto hello =[](auto s){ fprintf(s,"Hello\n"); return s; };
auto world =[](auto s){ fprintf(s,"World\n"); return s; };
terminal(stdout)
(hello)
(world) ;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
是否已经有了这个结构的名称,如果不是,它应该被称为什么?它是否类似于其他语言的结构?
备注:我对它是否真的有用并不感兴趣.
有许多令人印象深刻的Boost库,如Boost.Lambda或Boost.Phoenix,它们使C++成为一种真正的功能语言.但有没有一种直接的方法可以从任何2个或更多任意函数或函子创建复合函数?
如果我有:int f(int x)
并且int g(int x)
,我想做一些像f . g
静态生成一个新的函数对象的东西f(g(x)).
这似乎可以通过各种技术实现,例如这里讨论的技术.当然,您可以链接调用boost::lambda::bind
以创建复合仿函数.但是Boost中是否有任何东西可以轻松地让你接受任何2个或更多的函数或函数对象并将它们组合起来创建一个复合函子,类似于你在Haskell这样的语言中的表达方式?
我是一名数学家,以前很长一段时间都在做"旧式"C++编程.我觉得C++ 11提供的一些新的句法结构可以帮助我实现一些关于我的专业项目的更好的代码.然而,由于我不是CS专业,我必须承认我缺乏了解我在自学过程中遇到的一些例子的知识,尽管到目前为止我还很幸运/成功.
我的印象是,可变参数模板可用于实现类型安全的函数组合,如本问题所示.由于我想用异构(但兼容)的参数/返回类型编写函数,所以我的关注稍微有点笼统.我已经google了很多,并找到了另一个参考,但它似乎对我来说是"黑魔法";)我不会假装我可以在我的上下文中调整代码,虽然我觉得我应该在那里找到我需要的东西.
我认为下面的(最不完整的)代码对于我想要实现的内容是相对不言自明的.特别是我相信当一个人试图组合不兼容的函数(这里是箭头)时,正确的实现将抛出编译时错误,并且需要一段递归模板代码.
template <typename Source , typename Target> class Arrow
{
Target eval (const Source &);
};
template <typename ...Arrows> class Compositor
{
template <typename ...Arrows>
Compositor (Arrows... arrows)
{
// do/call what needs be here
};
auto arrow(); // gives a function performing the functionnal composition of arrows
};
// define some classes A, B and C
int main(int argc, char **argv)
{
Arrow < A , B > arrow1;
Arrow < B …
Run Code Online (Sandbox Code Playgroud)