c - gcc/clang 可以优化初始化计算吗?
问题描述
我最近编写了一个解析器生成器工具,它采用 BNF 语法(作为字符串)和一组操作(作为函数指针数组)并输出解析器(= 状态自动机,在堆上分配)。然后我使用另一个函数在我的输入数据上使用该解析器并生成一个抽象语法树。
在初始解析器生成中,有很多步骤,我想知道 gcc 或 clang 是否能够优化这一点,给定解析器生成函数的常量输入(并且从不使用指针值,只取消引用它们)?是否可以在编译时运行该函数,并将结果(也就是分配的内存)嵌入到可执行文件中?
(显然,这将使用链接时间优化,因为编译器需要能够检查整个函数是否确实具有相同参数的相同结果)
解决方案
在这种情况下,您可以做的是拥有生成代码的代码。
将您的初始解析器生成器作为独立运行的单独代码段。此代码的输出将是一个头文件,其中包含一组初始化为正确值的变量定义。然后,您在主代码中使用此文件。
例如,假设您有一个程序需要知道在给定字节中设置的位数。您可以在需要时手动执行此操作:
int count_bits(uint8_t b)
{
int count = 0;
while (b) {
count += b & 1;
b >>= 1;
}
return count;
}
或者您可以在单独的程序中生成表:
int main()
{
FILE *header = fopen("bitcount.h", "w");
if (!header) {
perror("fopen failed");
exit(1);
}
fprintf(header, "int bit_counts[256] = {\n");
int count;
unsigned v;
for (v=0,count=0; v<256; v++) {
uint8_t b = v;
while (b) {
count += b & 1;
b >>= 1;
}
fprintf(header, " %d,\n" count);
}
fprintf(header, "};\n");
fclose(header);
return 0;
}
这将创建一个名为 bitcount.h 的文件,如下所示:
int bit_counts[256] = {
0,
1,
1,
2,
...
7,
};
您可以将其包含在“真实”代码中。
推荐阅读
- html - 如何在我的所有网页内容后面运行 SVG 动画?
- java - (Java) 如何将数字从小到大排序并将它们分配给变量?
- node.js - Istio,无法从 microservice-1 调用 microservice-2
- jquery - 如何在 Laravel 的滑块中显示图像?
- python - On_release 按钮不起作用,转换也不起作用
- python - Python中的移位切比雪夫多项式
- kubernetes - 如何在普罗米修斯中以字节为单位获取 pod 的磁盘 I/O 读写
- ibm-cloud - IBM 区块链云服务未获批准
- python - 在 Python 中使用 daff 包比较 2 个 CSV 文件
- javascript - 未捕获的不变违规:超出最大更新深度