gpt4 book ai didi

c++ - 使用assert帮助编译器更好的优化

转载 作者:IT老高 更新时间:2023-10-28 22:22:34 31 4
gpt4 key购买 nike

考虑这段代码:

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 有副作用。 IE。是否可以创建一个 new_assert 来检查其条件是否有副作用?

This是一个相关的问题。

This是一个非常相似的问题,但这次我问的是是否可以为 assert 宏创建一个完全替换(这样我们就可以避免手动注释代码)

最佳答案

我认为,如果您只是在 new_assert() 宏中添加未定义的行为,编译器将决定这些先决条件是不可协商的。并生成更快的代码。

但是,如果您的代码有问题,并且断言失败,那么任何事情都可能发生。

关于c++ - 使用assert帮助编译器更好的优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46159248/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com