代码之家  ›  专栏  ›  技术社区  ›  zebediah49

在运行时编译常量

  •  1
  • zebediah49  · 技术社区  · 14 年前

    我有一个科学模拟程序,因此需要快速运行。

    问题是,当我试图改变,它变得慢了很多。例如,改变

    #define WIDTH 8
    //..... code
    

    #define WIDTH width
    int width;
    //... main() {
    width=atoi(argv[1]);
    //...... code
    

    所以我的问题是,我是否有某种方法(bash脚本?)在运行时编译我想在程序中使用的常量。如果任何需要运行它的机器上都必须有一个编译器,这是可以的。它目前使用一个标准(相当简单)的Makefile进行编译。
    --这也允许march=native,这应该会有点帮助。

    我想我的问题是,是否有更好的方法完全做到这一点。。。

    3 回复  |  直到 14 年前
        1
  •  4
  •   Jerry Coffin    14 年前

    至少如果我正确理解你的问题,我可能会这样做:

    #ifndef WIDTH
    #define WIDTH 8
    #endif
    

    (对于您想要修改的其他常量也是如此)。在makefile中,添加一些选项到makefile中,以便在必要时/如果需要,将正确的定义传递给编译器,因此如果要更改宽度,可以使用以下方法:

    cflags=-DWIDTH=12
    

        2
  •  2
  •   Evan Teran    12 年前

    不同的是,由于宏只是一个整数文本,编译器通常能够在编译时计算一堆数学。一个简单的例子是:

    int x = WIDTH * 3;
    

    编译器实际上会发出:

    int x = 24;
    

    没有乘法。如果将WIDTH更改为一个变量,它就不能这样做,因为它可以是任何值。所以几乎可以肯定的是 速度上的差异(多少取决于环境,而且往往很小,无关紧要)。

    唯一真正的解决方案是使用一个单独的头文件,其中包含可以由脚本生成的常量,然后编译程序。或者如果没有太多直接传递给gcc。这当然牺牲了运行时的速度。我想知道运行时0.8秒的时间差是不是负担得起,编译一个程序(肯定要花一秒钟以上)是如何负担得起的?

    脚本可以是这么简单:

    #!/bin/sh
    
    echo "#define WIDTH $1" > constants.h
    echo "#define HEIGHT $2" >> constants.h
    gcc prog.c -o prog && ./prog
    

    其中prog.c包含常量.h或类似的内容(没有额外的标题)。

    #!/bin/sh
    gcc -DWIDTH=$1 -DHEIGHT=$2 prog.c -o prog && ./prog
    
        3
  •  1
  •   Secure    14 年前

    您可以将相关定义存储到单独的头文件constants.h中:

    #ifndef CONSTANTS_H
    #define CONSTANTS_H
    
    #define WIDTH 8
    ...other defines...
    
    #endif