gpt4 book ai didi

c++ - 编译器、If 语句和循环

转载 作者:太空狗 更新时间:2023-10-29 20:25:15 25 4
gpt4 key购买 nike

这是一道c++的通用效率题。我不熟悉编译器的内部工作原理,所以假设我有几个循环和一个潜在的 if 语句,例如:

for(int i=0; ...) 
{
for(int j=0; ...)
{
if( ... )
{
...
}
else
{
... (slightly different)
}
}
}

但是,此 if 语句独立于循环。如果我在循环外定义 if/else 语句,在循环内定义 if/else 语句,是否会有显着的速度差异?例如:

if( ... )
{
for(int i=0; ...)
{
for(int j=0; ...)
{
...
}
}
}
else
{
for(int i=0; ...)
{
for(int j=0; ...)
{
... (slightly different)
}
}
}

如果是这样,或者如果不是这样,那是为什么?我有一些想法,即编译器会识别重复执行的相同 if 语句,但这对我来说是相当陌生的领域。

我检查了对这个问题的回答: Would compiler optimize conditional statement in loop by moving it ouside the loop?他讨论了 gcc 中不同级别的优化,以及 -O3(我认为)将如何做到这一点。但是这样的事情是自动完成的吗?如果不是,那么循环内的这样一个 if 语句的成本有多大?

最佳答案

唯一真正的答案是也许。如果条件是一个循环不变的,那么你建议的换位是合法的,如果编译器可以识别循环不变性,然后它可以使换位。做与不做取决于编译器:g++/O3 至少在 64 位模式下,cl/Ox/Os不会,至少在 32 位模式下; g++ 还展开了两个循环。至少在我的测试中;我或多或少保证编译器可以确定条件是循环不变的通过使用条件将循环包装在函数中bool const 类型的函数参数;取决于条件,编译器可能或多或少难以证明循环不变性。当然,事实上编译器可以在 64 位模式下使用更多寄存器也影响其优化。

此外:虽然我本能地希望 g++ 版本是更快,它明显更大;在某些情况下,这可能对各种内存缓存产生负面影响,导致代码实际运行速度较慢。

最后,我总是写第一个。如果稍后分析器表明它是一个瓶颈,回去没有问题并沿着第二行重写它,然后测量看看它是否有所不同,无论是一种方式还是另一种方式,以及如何它有很大的不同。请注意,最好的结果可能取决于编译器和你的架构定位。

关于c++ - 编译器、If 语句和循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24443652/

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