【发布时间】:2011-03-03 16:06:34
【问题描述】:
我正在使用一个可能很危险的宏:
#define REMAINDER(v, size) ((v) & (size -1))
显然它假定大小是 2 的幂。
我想确保 size 确实是 2 的幂,但在编译时。 (运行时测试很简单,但不是我想要的)。
对我来说,一个充分的测试是 size 始终是一个常数(绝不是变量)。
我会使用BOOST_STATIC_ASSERT,但我不知道如何使用它来满足我的需要。
【问题讨论】:
-
这里有另一个建议:停止这些微不足道的微优化工作并将其留给编译器。无论如何它都可以做得更好,而且你的代码不会无缘无故地被丑陋的东西填满。即使您的编译器是 1970 年的并且没有对此进行优化,它仍然可能不需要/对性能绝对没有明显影响!
-
这样做的目的是什么?当然,任何体面的优化器都会优化涉及二次幂的操作!?!
-
带有 -O3 的 GCC 将
var % constant优化到恰好如果constant是 2 的幂。这是一个众所周知且易于实现的优化,所以我假设其他编译器也会这样做。 -
无论如何(关于我的评论,@delnan's 和@Nim's),虽然手动微优化可能并不重要,但确保数字是 2 的幂(这样编译器实际上可以执行优化本身)是一个有效的目标。也就是说,虽然我会删除该宏,但在编译时确保
size是 2 的幂是一个明智的想法。 -
LLVM 后端正确处理(对于 4),甚至更好的是,如果
v(出于某种原因)签名,则不会生成错误代码。
标签: c++ boost assertions