例如
bool CheckWithinBoundary(int x, int b) {
return (x>=0) && (x <= b);
}
bool CheckWithinBoundary2(int x, int b) {
return static_cast<uint32>(x) <= static_cast<uint32>(b);
}
CheckWithinBoundary2可以保存一个比较。
我的问题是:
今天的编译器可以使用它来优化代码吗?或者我怎样才能做到 编译器做这种优化吗?
使用这个技巧有危险吗?
答案 0 :(得分:3)
2的答案是,是的,这两个是不一样的。看来你也默默地假设b >= 0
。考虑例如x == 1
和b == -1
,这将为第一个案例提供false
,为第二个案例提供true
。
(我切换到C符号,这对我来说更容易,因为你似乎也对它感兴趣)
所以我们实际上已经有了
static_assert(INT_MAX < UINT_MAX);
bool CheckWithinBoundary(int x, int b) {
return (b >=0) && (x>=0) && (x <= b);
}
bool CheckWithinBoundary2(unsigned x, unsigned b) {
return (b >=0) && (x <= b);
}
如果它编译,则在INT_MAX < UINT_MAX
的所有体系结构中都是等效的,然后隐式转换int --> unsigned
做正确的事。
但请注意,您注意我使用的是unsigned
而不是uint32_t
,因为您必须确保使用宽度相同的无符号类型。我不知道是否存在64位int
的架构,但是你的方法会失败。