使用 assert 帮助编译器更好地优化
Using assert to help the compiler to optimize better
请考虑以下代码:
void foo(int n) {
assert(n>=0&&n<=3);
for (int i=0; i<n; i++) {
doSomething();
}
}
在这里,有一个断言:n
介于 [0;3]. 断言通常用于检查程序员的错误。但在这里,它可以用作编译器的提示,即n
介于 [0;3],因此可以更好地优化。也许它可以展开循环,并使用跳跃。
对于 GCC,我们可以手动帮助编译器:
if (!(n>=0&&n<=3)) __builtin_unreachable();
在这里,GCC 实际上被告知 n 介于 [0;3],因此它可以生成更好的代码。
我的问题是:是否可以创建一个(可能依赖于编译器)new_assert
宏,它可以在发布版本中向编译器提供提示?此解决方案必须是透明的,因此它可以完全替代assert
宏。例如,在"new_assert(func());
"中,如果func()
有副作用,则不得在发布版本中调用。
或者,如果不可能,另一个有用的new_assert
可能是,如果不允许条件有副作用(它会导致编译时错误),所以我们可以在发布版本中使用if (!(cond)) __builtin_unreachable();
,而不必担心cond
有副作用。 即是否可以创建一个检查其条件是否有副作用的new_assert
?
这是一个相关的问题。
这是一个非常相似的问题,但这次我问是否可以为assert
宏创建一个完整的替代品(这样我们就可以避免手动注释代码)
我认为,如果您只是在 new_assert() 宏中添加未定义的行为,编译器将决定这些前提条件是不可协商的。 并生成更快的代码。
但是,如果您的代码有问题,并且断言失败,则可能发生任何事情。
你可以使用来自GNU的Gnulib的跨平台宏assure' from
'。
相关文章:
- C++:将控制台输出存储在宏中更好吗
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 初始化具有非默认构造函数的std::数组项的更好方法
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 为什么新的随机库比std::rand()更好
- 寻找一种更好的方法来表示无符号字符数组
- 哪种方法更好,性能明智
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- 什么是更好的做法?通过指针或标识符传递类成员?
- 寻求更好地理解标准::访问
- 线程消息传递或更好:在"大师班"中访问其他班级的成员
- 哪个版本(调试/发行 - 未取代/优化)更好地研究C 与组件进行比较
- 使用 assert 帮助编译器更好地优化
- 从源代码构建编译器是否会带来更好的优化
- 现代 C/C++ 编译器能否更好地优化标头中的代码
- 是否有任何情况将对象标记为 const 会导致更好的优化代码(使用优化编译时)
- 我是否应该将 const 用于局部变量以获得更好的代码优化
- 当我在一个步骤中编译所有内容时,GCC 可以更好地优化事情吗?
- 如何告诉c++编译器对象没有在其他地方被改变以达到更好的优化
- constexpr vs const:将使用constexpr而不是const更好地帮助编译以优化