如何帮助编译器根据输入的约束优化我的程序?

时间:2015-01-18 06:20:09

标签: c++ c optimization constraints compiler-optimization

我在C:

中设置了一个类似于以下内容的设置GPIO引脚
void f(int pin) {
    bank[pin/32] = 1 << (pin%32);
}

现在,我知道为这个函数提供小于0或大于63的值是未定义的行为(bank周围的寄存器被读作垃圾),因此这个代码可以被视为等价:

void f(int pin) {
    bank[pin > 31] = 1 << (pin - 32*(pin>31));
}

我对我的架构知之甚少,无法确定哪一个将转换为最有效的机器代码,而这只是多个平台上这类函数的众多示例之一。但是,如果我能以某种方式指示我的编译器假设0&lt; = pin&lt; 64,那么它理论上可以为我选择最有效的上述实现。

有没有办法告知编译器在优化过程中可能有益的约束?

2 个答案:

答案 0 :(得分:2)

你可以使pin有点字段结构:

struct Pin
{
     unsigned int pin : 6; // can hold values up to 64
};

答案 1 :(得分:1)

最简单和最简单的改变是使pin无符号。对于任何合理的编译器,这应该改进为除法发出的代码和moduo的常量(因为不需要处理负面情况)。

某些编译器允许您通过特定于实现的机制(如VS&__assume)指定其他信息。在什么情况下这样做是有效的问题。