【发布时间】:2017-05-10 06:23:06
【问题描述】:
我是 C++ 新手。我发现下面的编程风格对我来说很有趣。我在这里写了一个简化版。
#include <iostream>
using namespace std;
class MyClass {
public :
MyClass(int id_) : id(id_) {
cout<<"I am a constructor"<<endl;
}
bool error = false;
void run() {
//do something ...
if (!error) {
read();
}
}
void read() {
//do something ...
if (!error) {
write();
}
}
void write() {
//do something ...
if (!error) {
read();
}
}
private :
int id;
};
int main() {
MyClass mc(1);
mc.run();
return 0;
}
这里的例子是可编译的,但我没有运行它,因为我必须进入一个无限循环。但是,我希望以此作为参考。 read() 和 write() 互相调用。我第一次遇到这种编程风格是在boost.asio。当服务器在 do_read() 中收到一条消息时,它调用 do_write() 来回显客户端,然后在 do_write() 结束时再次调用 do_read()。
关于这种类型的编码,我有两个问题。
这会导致堆栈溢出吗?因为函数一直在调用自己并且函数结束只会发生错误。
-
它有什么好处?为什么我不能用一个函数让它们有序循环,遇到错误就中断循环。
bool replied = true; while (!error) { if (replied) read(); else { write(); replied = !replied; } }
【问题讨论】:
-
如果你在做正确的尾调用,编译器应该优化它们以防止调用堆栈溢出。
-
如何定义“正确”?
-
表示控制权不必返回给调用者,即
return f(x);是尾调用,int y = f(x); return y;不是。
标签: c++ boost boost-asio