gpt4 book ai didi

C中for结构头表达式值的计算

转载 作者:太空宇宙 更新时间:2023-11-04 08:08:58 24 4
gpt4 key购买 nike

我最近一直在做 Euler 项目,我想我不妨模块化地解决这些问题,这样我就可以将这些函数添加到我的个人库中。当我将代码模块化时,我看到了一些可能效率低下的表达式:

for( ; forCounter <= limit / number1 * number1; forCounter += number1)

for( ; forCounter <= limit / number2 * number2; forCounter += number2)

for( ; forCounter <= limit / (number1 * number2) * (number1 * number2); forCounter += number1 * number2)

这些计算是只进行一次还是每次迭代都进行一次?一个接近的例子是 for 循环 header 的初始化部分中的表达式 int x = 5。它第一次被声明和初始化,但在其他迭代中它只是被分配了值。

最佳答案

是的,这是非常低效的,因为这些计算是在每次迭代中完成的(有时编译器可以优化代码,如果查看 limitnumber1number2 在循环时间内保持不变)。但一般规则 - 需要在循环之前计算所有常量(在循环时间期间)表达式,而不是每次循环。所以代码必须是这样的:

ULONG n = limit / number1 * number1;
for( ; forCounter <= n; forCounter += number1) { ...}

ULONG m = number1 * number2, n = limit / m * m;
for( ; forCounter <= n; forCounter += m) { ... }

编辑

如果 limit , number1 和 number2 是常数值例如

#define limit 999
#define number1 3
#define number2 5

limit/number1 * number1 也是常量表达式,在编译时计算。在这种情况下

for( ; forCounter <= limit / number1 * number1; forCounter += number1)

绝对正常有效。

但是如果他们像这样变量:

ULONG limit, number1, number2;

limit/number1 * number1 可以在每次迭代时重新计算。这取决于编译器、优化和声明 limit, number1, number2 的位置(在全局范围内或在函数中局部)——这个变量是否可以在循环时间内更改。这可能是自动优化的,但不能保证。最好总是通过 self 直接优化代码

关于C中for结构头表达式值的计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40821952/

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