强制编译时计算C

时间:2018-09-22 08:02:39

标签: c compiler-optimization

比方说,我有一个文件,其中对一些数据进行了一些计算。可能是(很多psedo计算)如下:

void hash_value(unsigned char* value){
    unsigned char i;
    for(i + 0; i < 10; i++){
        value[i] ^= (0x1b+i)
    }
}

void break_value(unsigned char* value){
    unsigned char i;
    for(i = 0; i < 10; i++)
        value[i] &= 0x82;
}

void affect_value(unsigned char* value){
    hash_value(value);
    break_value(value);
}

我主要要做的是:

#include "smart_calculations.h"

int main() {
    unsigned char value[16] = {'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S'};
    affect_value(value);
    // Do other stuff

}

由于我不打算更改value数组的内容,但是我需要先进行计算,然后才能继续执行其他操作。我想有些编译器会识别并优化代码,以便在编译时计算数据。

我的问题是,如何(最好)迫使编译器在编译时进行此优化,以使“ Smart_calculations”文件中的方法不会浪费最终产品中的空间,并且数组未编译到程序中?

1 个答案:

答案 0 :(得分:3)

最简单,最通用的方法是手动执行登台。也就是说,运行在构建阶段显式执行预计算的代码,然后仅将结果编译到程序中。

如果要在C语言中完成所有操作,则可以使用smart_calculations.c函数创建一个main。您首先要编译一个生成的smart_calculations可执行文件

unsigned char value[16] = { ... };

作为输出。将此输出放置在文件中,例如smart_generated.h

然后您的真实程序将#include这个文件:

int main() {
    #include "smart_generated.h"  // 'value' is now a local variable
    // Do other stuff    
}

...或(如果需要全局变量,则)将生成的结果放入.c文件中,并将其链接到程序中。

当然,使用这种方法,您不仅限于用C语言进行“智能计算”。您可以使用在构建时可用的任何编程语言或环境。