定义一种新的优化类型

时间:2016-04-27 01:14:35

标签: c++ optimization g++

有没有办法告诉g++更多关于我可能知道可以安全预制的类型,函数或特定变量(属性除外)。

示例:

TurnLedOn();
TurnLedOn();

只有第一个函数实际上关闭第二个函数上的LED实际上并没有做任何事情....所以可以告诉g++更多关于函数的信息,这样它就可以摆脱第二次调用它知道LED已打开(因为它知道尚未调用相应的TurnLedOff()功能)....

我不想使用g++属性的原因是因为我想随意定义优化,这对于属性来说实际上是不可能的(我相信我在这里尝试的优化实际上不可能以使用属性)

3 个答案:

答案 0 :(得分:4)

这些是您需要编码的优化。如:

class LedSwitch {
    bool isOn{false};
public:
    inline void turnLedOn(){
        if (!isOn) {
            isOn = true;
            // ...
        }
    }
    // ...
}
// ...

如果代码内联,那么编译器可能会注意到第二个硬编码顺序调用中bool被否定,但为什么首先这样做?

如果这样的事情会降低您的代码速度,也许您应该重新设计设计。

答案 1 :(得分:2)

一种可能性是使其成为,以便第二个TurnLedOn调用不执行任何操作,并使其内联并在头文件中声明它,以便编译器可以在任何源文件中看到定义:

extern bool isLedOn; // defined somewhere else
inline void TurnLedOn()
{
    if(!isLedOn)
    {
        ActuallyTurnLedOn();
        isLedOn = true;
    }
}

然后编译器可能能够自己弄清楚调用TurnLedOn两次没有任何用处。当然,与任何优化一样,您无法保证。

答案 2 :(得分:0)

与你的想法相反,@ immibis的回答是你所期待的。

这种方式描述函数TurnLedOn的复杂行为(即,除非被其他一些动作解锁,否则不需要连续两次调用)确实是如何告诉编译器执行这种“优化”。

您能想象其他注释,例如

#pragma call_once_toggle_pair(TurnLEDOn, TurnLEDOff)

有无数的变种描述你所有的变幻莫测?

C ++语言有足够的条款让你表达任意复杂的情况,请不要在其上添加一层复杂性。