我在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,那么它理论上可以为我选择最有效的上述实现。
有没有办法告知编译器在优化过程中可能有益的约束?
答案 0 :(得分:2)
你可以使pin有点字段结构:
struct Pin
{
unsigned int pin : 6; // can hold values up to 64
};
答案 1 :(得分:1)
最简单和最简单的改变是使pin
无符号。对于任何合理的编译器,这应该改进为除法发出的代码和moduo的常量(因为不需要处理负面情况)。
某些编译器允许您通过特定于实现的机制(如VS&__assume
)指定其他信息。在什么情况下这样做是有效的问题。