有没有办法告诉g++
更多关于我可能知道可以安全预制的类型,函数或特定变量(属性除外)。
示例:
TurnLedOn();
TurnLedOn();
只有第一个函数实际上关闭第二个函数上的LED实际上并没有做任何事情....所以可以告诉g++
更多关于函数的信息,这样它就可以摆脱第二次调用它知道LED已打开(因为它知道尚未调用相应的TurnLedOff()
功能)....
我不想使用g++
属性的原因是因为我想随意定义优化,这对于属性来说实际上是不可能的(我相信我在这里尝试的优化实际上不可能以使用属性)
答案 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 ++语言有足够的条款让你表达任意复杂的情况,请不要在其上添加一层复杂性。