gcc / clang可以优化初始化计算吗?

时间:2018-06-20 13:09:48

标签: c gcc compilation compiler-optimization compile-time

我最近编写了一个解析器生成器工具,该工具采用BNF语法(作为字符串)和一组动作(作为函数指针数组)并输出解析器(=状态自动机,分配在堆上)。然后,我使用另一个函数在输入数据上使用该解析器并生成抽象语法树。

在最初的解析器生成中,有很多步骤,而且我想知道gcc或clang是否能够优化它,只要将常量输入解析器生成函数(并且从不使用指针值,就只对它们进行解引用) )?是否可以在编译时运行该函数,并将结果(也就是分配的内存)嵌入可执行文件中?

(显然,这将使用链接时间优化,因为编译器将需要能够检查整个函数的确具有相同参数的相同结果)

1 个答案:

答案 0 :(得分:1)

在这种情况下,您可以做的是拥有可生成代码的代码。

将您的初始解析器生成器作为独立运行的单独代码。该代码的输出将是一个头文件,其中包含一组初始化为适当值的变量定义。然后,您可以在主要代码中使用此文件。

作为一个示例,假设您有一个程序需要了解给定字节中设置的位数。您可以在需要时手动执行此操作:

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,
};

您可以将其包含在“真实”代码中。