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

“外部常量”的划分优化

  •  3
  • Yousf  · 技术社区  · 15 年前

    我工作的项目中,我有以下代码:

    文件1.C

    extern const int z;
    int x;
    do_some_stuff_to_calculate_x();
    y = x / z;
    do_some_stuff_with_y();
    

    文件2.C

    const int z = Z_INIT_VALUE; // some value defined in some .h file.
    

    关注点是 file1.c . 自从 z extern ,因此它在编译时未知[将在链接时定义]。 所以,编译器无法优化除法。

    我知道如果 Z 在编译时编译器将把除法转换成乘法和其他一些操作。

    请注意,file1.c将作为库传递,因此请重新编译 文件1.C 具有 file2.c 不是一个选择。

    有人知道如何让链接器优化这些东西吗? 或者有其他的方法来避免这个昂贵的部门?

    THX:)

    更新:

    好吧,在我看到一些答案后,我注意到需要更多的细节才能使这个问题更具信息性。

    • 我用的是一个叫 renesas (SH725家族)。
    • 在代码中的许多地方都可以找到这个分区,有很多变体。
    • 代码中的其他大部分内容是直接读写寄存器和端口(无开销,即:*0x0abcdeff=15)。

    包含除法的函数通常是这样的。

    extern const int common_divisor;
    extern const int common_addition;
    
    void handleTheDamnInterrupt(void)
    {
        int x = *(REG_FOO_1);
        int y = x / common_divisor;
        y += common_addition;
        if( x > some_value )
        {
           y += blah_blah;
        }
        else
        {
           y += foo_bar;
        }
    
        *(REG_BAR_1) = y;
    }
    

    这个函数是所有程序中的典型函数形式。因为我有很多不同周期的函数,所以不知道除法对程序有多大的影响。
    但当我试图移除 外部的 const 给它任意的值,它会更好。

    4 回复  |  直到 15 年前
        1
  •  3
  •   Ants Aasma    15 年前

    您可以自己进行同样的优化,在初始化时执行一些设置计算。Terje Mathisen发明的将整数除法转换为乘法的算法如下所述: http://www.asdf.org/~fatphil/x86/pentopt/27.html

        2
  •  2
  •   Thomas    15 年前

    比如微软的链接器, 优化这个。它被称为“链接时间代码生成”。 Here's an article about it (过时了,但仍然有用)。已经打开了 /LTCG flag .

        3
  •  2
  •   unwind    15 年前

    如果我看过的话,这就是微观优化。您应该分析并可能编辑您的问题,并给出一些结果,说明为什么优化单个整数操作如此重要。

    如果 z 实际上是常量,并从预处理器符号初始化,只需将该符号放在库的头中,并完全停止将其作为运行时变量引入。

        4
  •  0
  •   Mike Dunlavey    15 年前

    你的电话 do_some_stuff 将远远超过整数除法。