在LLVM Kaleidoscope教程中,我找到了以下代码:
glob()
我很困惑为什么这个存储在unique_ptr而不是常规的全局变量中。也许对象太大了,进行堆分配而不是堆栈会更有效率?毕竟,static std::unique_ptr<Module> TheModule;
在我的系统上是728。我可以根据推测得到具体的答案吗?感谢。
答案 0 :(得分:2)
在chapter 4 TheModule
中便宜地移入JIT(AFAIK然后在代码生成后删除),然后使用新的Module
重新初始化,这不适用于静态{{1变量。
Module
虽然可以编写JIT以将 auto H = TheJIT->addModule(std::move(TheModule));
InitializeModuleAndPassManager(); // here a new empty module is created
指针传递给Module
,但之后不能用新模块替换静态IRCompileLayer
变量。
教程说明了这一点:
将模块添加到JIT后,它就不再存在了 修改后,我们也打开一个新模块来保存后续代码 调用InitializeModuleAndPassManager()。
Module
如果TheModule是static void InitializeModuleAndPassManager() {
// Open a new module.
TheModule = llvm::make_unique<Module>("my cool jit", TheContext);
而不是Module
,则此分配将失败。