首页 > 解决方案 > 强制编译时计算 C

问题描述

假设我有一个文件,我在其中对一些数据进行一些计算。它可能是(非常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”文件中的方法不会在最终产品中浪费空间,并且数组的初始值不是t 编译到程序中?

标签: ccompiler-optimization

解决方案


最简单、最通用的方法是手动进行暂存。也就是说,在构建阶段运行显式执行预计算的代码,并且只将结果编译到程序中。

如果你想在 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 中进行“智能计算”。您可以使用在构建时可用的任何编程语言或环境。


推荐阅读