【发布时间】:2011-03-03 20:24:43
【问题描述】:
我对 c/c++ 的(部分)编译时评估很感兴趣(不是像 c++ 中那样使用模板参数)。让我们考虑以下情况(取自 [1]):
double mypower(double x, int n) {
int i;
double ret = x;
for (i = 1; i < n; i++) {
ret *= x;
}
return ret;
}
然后你在代码的某处调用这个函数:
mypower(x,3); // y varies all the time,
然后编译器可以对此进行优化(例如循环展开)。我使用的一些经常使用的函数可以真正从优化中受益(通过手动创建专用函数进行测试)。演示文稿 [1] 描述了一个过程,其中函数被搜索并被函数的专用版本替换。这似乎有效。但是好像不是很通用,要替换的功能需要写代码。
演示文稿似乎是 2008 年的,我找不到比此来源更多的信息。那么从那以后有什么改善吗?我更喜欢某种自动化,它对可能由属性语法控制的所有功能(例如__attribute__(peval)...)执行相同的操作。此外,我希望同样适用于面向对象的代码,为不同的对象创建专门的类([2] 似乎表明这是不可能的)。
此外,我希望这种专业化不仅适用于代码中的常量。我正在考虑编译为 LLVM IR(字节码)的程序可以执行以下操作:
在解释器的初始化阶段运行程序,在初始化阶段,程序可以从文件中读取一些配置。初始化后解释器停止。
从那时起,某些变量(包括成员变量)是固定的。提取这些变量(例如在编译期间由属性标记)。
创建专门的函数和类。将这些克隆到字节码中。
运行 JIT 以创建本机机器代码。
这是我要求的很多,只有少数计算密集型程序会从这种优化中受益。但有些人一定在努力。我可能只是不知道为谷歌提供信息的正确搜索词。
注意:请不要建议带有非类型参数或手动专业化的模板类,我已经这样做了。我只是希望编译器为我完成这项工作。
链接:
【问题讨论】:
标签: c++ optimization partial llvm evaluation