模拟C++堆上的方法调用
Emulate method call on heap in C++?
尽管堆内存的分配速度比线程调用堆栈慢,但它要大得多,从而为执行大量操作(例如大规模递归方法调用)留出了空间。尽管可以调整堆栈大小,但相对于堆(超过 1 GB 可用),允许的值仍然相对较小(可用几 MB)。
出于好奇,在C++(例如)中,是否可以通过使用堆而不是线程调用堆栈来模拟调用方法?
这是一个(人为的,可能过于复杂)阶乘的实现,它只使用堆:
#include <iostream>
#include <vector>
#include <memory>
#include <numeric>
#include <typeinfo>
struct factorial
{
struct call_concept
{
virtual int operator()() const = 0;
virtual std::unique_ptr<call_concept> generate_next() const = 0;
virtual ~call_concept() = default;
};
static std::unique_ptr<call_concept> generate_term(int i);
struct terminator : call_concept
{
int operator()() const override { return 1; }
std::unique_ptr<call_concept> generate_next() const override { return nullptr; }
};
struct fact_term : call_concept
{
fact_term(int i) : _i(i) {};
int operator()() const override { return _i; }
std::unique_ptr<call_concept> generate_next() const override {
return generate_term(_i - 1);
}
int _i;
};
struct call
{
call(std::unique_ptr<call_concept> pc) : _impl(std::move(pc)) {}
int operator()() const {
return _impl->operator()();
}
int operator*(const call& r) const {
return (*this)() * r();
}
std::unique_ptr<call_concept> _impl;
};
friend int operator*(int i, const call& r) {
return i * r();
}
int operator()(int i) {
auto pt = generate_term(i);
std::vector<call> stack;
while (pt) {
auto next_term = pt->generate_next();
stack.emplace_back(std::move(pt));
pt = std::move(next_term);
}
return std::accumulate(std::begin(stack), end(stack), 1, std::multiplies<>());
}
};
auto factorial::generate_term(int i) -> std::unique_ptr<call_concept>
{
if (i > 1) {
return std::make_unique<fact_term>(i);
}
else {
return std::make_unique<terminator>();
}
}
int main()
{
auto i = factorial()(10);
std::cout << i << std::endl;
return 0;
}
预期成果:
3628800
相关文章:
- 如何强制从重写方法调用重写的方法基方法?
- C++:使用方法调用析构函数的顺序是什么?
- 派生类调用父类的方法,该方法调用重写的虚拟方法调用错误的方法
- 使用 object 中的方法调用带有 std::bind 和 std::function.target 的 C 样式函数
- 指向类方法调用的指针
- 如何使用 SFINAE 在方法调用中有条件地定义变量?
- 是否有可以处理方法调用依赖关系的设计模式?
- 如何缩短C++中的方法调用?
- 从部分专用模板方法调用模板非静态方法
- 有没有办法禁止派生类中的基类方法调用?
- 为什么这C++只在编译器上编码一个不明确的方法调用Microsoft?
- 从父方法调用子方法
- 如何将子方法调用到父方法
- 虚拟函数在哪里使用 vpointer to vtable 来解析方法调用,非虚拟方法存储在哪里以及如何解析它们?
- 从静态方法调用静态函数指针
- 从同一类中的另一个方法调用方法时出错
- 方法调用意外地像 l 值一样起作用
- 无法从派生的一个方法调用基类方法
- 从类方法调用命名空间中名为 Same 的函数时,重载解析失败
- C 多线程JAVA JNI方法调用