gpt4 book ai didi

c - a += b 比 C 中的 a = a + b 更有效吗?

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

我知道以下一些语言:

a += b

效率高于:

a = a + b

因为它消除了创建临时变量的需要。 C中是这样吗?使用 += 是否更有效(因此 -= *= 等)

最佳答案

所以这是一个明确的答案......

$ cat junk1.c
#include <stdio.h>

int main()
{
long a, s = 0;
for (a = 0; a < 1000000000; a++)
{
s = s + a * a;
}
printf("Final sum: %ld\n", s);
}

michael@isolde:~/junk$ cat junk2.c
#include <stdio.h>

int main()
{
long a, s = 0;
for (a = 0; a < 1000000000; a++)
{
s += a * a;
}
printf("Final sum: %ld\n", s);
}

michael@isolde:~/junk$ for a in *.c ; do gcc -O3 -o ${a%.c} $a ; done
michael@isolde:~/junk$ time ./junk1
Final sum: 3338615082255021824

real 0m2.188s
user 0m2.120s
sys 0m0.000s
michael@isolde:~/junk$ time ./junk2
Final sum: 3338615082255021824

real 0m2.179s
user 0m2.120s
sys 0m0.000s

...适用于我的 计算机和在我的 操作系统上运行的我的 编译器。您的结果可能会或可能不会有所不同。然而,在我的系统上,时间是相同的:用户时间 2.120 秒。

现在只是为了向您展示现代编译器有多么令人印象深刻,您会注意到我在作业中使用了表达式 a * a。这是因为这个小问题:

$ cat junk.c
#include <stdio.h>

int main()
{
long a, s = 0;
for (a = 0; a < 1000000000; a++)
{
s = s + a;
}
printf("Final sum: %ld\n", s);
}

michael@isolde:~/junk$ gcc -O3 -S junk.c
michael@isolde:~/junk$ cat junk.s
.file "junk.c"
.section .rodata.str1.1,"aMS",@progbits,1
.LC0:
.string "Final sum: %ld\n"
.text
.p2align 4,,15
.globl main
.type main, @function
main:
.LFB22:
.cfi_startproc
movabsq $499999999500000000, %rdx
movl $.LC0, %esi
movl $1, %edi
xorl %eax, %eax
jmp __printf_chk
.cfi_endproc
.LFE22:
.size main, .-main
.ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
.section .note.GNU-stack,"",@progbits

编译器找出了我的循环并将其展开到计算累积和的位置,并将其作为常量嵌入并继续打印出来,完全跳过任何类型的循环构造。面对如此聪明的优化器,您真的认为您会在区分 s = s + as += a 时找到任何有意义的优势吗?!

关于c - a += b 比 C 中的 a = a + b 更有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5031604/

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