作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我用 gcc -O3 -S a.c
编译了以下 c 程序:
#include <stdio.h>
int main() {
int sum = 0;
for (int i = 0; i <= 100; i++) {
sum += i;
}
printf("%d", sum);
}
生成的汇编代码如下:
.section __TEXT,__text,regular,pure_instructions
.build_version macos, 10, 15 sdk_version 10, 15, 4
.globl _main ## -- Begin function main
.p2align 4, 0x90
_main: ## @main
.cfi_startproc
## %bb.0:
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset %rbp, -16
movq %rsp, %rbp
.cfi_def_cfa_register %rbp
leaq L_.str(%rip), %rdi
movl $5050, %esi ## imm = 0x13BA
xorl %eax, %eax
callq _printf
xorl %eax, %eax
popq %rbp
retq
.cfi_endproc
## -- End function
.section __TEXT,__cstring,cstring_literals
L_.str: ## @.str
.asciz "%d"
.subsections_via_symbols
好像 GCC 运行了代码并注意到循环时间已确定并且 GCC 替换了
movl $5050, %esi
gcc 是如何做这种优化的?
最佳答案
我试图找到特定的标志,但没有运气。我只能用 -O1
重现您的结果所以我之后所做的是手动添加所有由 -O1
启用的标志.但是当我这样做时,我无法重现结果。
并且可以在 documentation 中阅读
Not all optimizations are controlled directly by a flag. Only optimizations that have a flag are listed in this section.
-O1
完成的添加没有标志的。
$ gcc -fauto-inc-dec -fbranch-count-reg -fcombine-stack-adjustments \
-fcompare-elim -fcprop-registers -fdce -fdefer-pop -fdelayed-branch -fdse \
-fforward-propagate -fguess-branch-probability -fif-conversion \
-fif-conversion2 -finline-functions-called-once -fipa-profile \
-fipa-pure-const -fipa-reference -fipa-reference-addressable \
-fmerge-constants -fmove-loop-invariants -fomit-frame-pointer \
-freorder-blocks -fshrink-wrap -fshrink-wrap-separate -fsplit-wide-types \
-fssa-backprop -fssa-phiopt -ftree-bit-ccp -ftree-ccp -ftree-ch \
-ftree-coalesce-vars -ftree-copy-prop -ftree-dce -ftree-dominator-opts \
-ftree-dse -ftree-forwprop -ftree-fre -ftree-phiprop -ftree-pta \
-ftree-scev-cprop -ftree-sink -ftree-slsr -ftree-sra -ftree-ter \
-funit-at-a-time -S k.c
cc1: warning: this target machine does not have delayed branches
$ grep "5050" k.s
$ gcc -O1 -S k.c
$ grep "5050" k.s
movl $5050, %esi
$
关于c - gcc 如何将 sum 从 1 到 100 优化为 5050,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65896918/
出于好奇,我尝试了一些原型(prototype)制作,但似乎只允许在第一个位置使用子例程的原型(prototype) &。 当我写作时 sub test (&$$) { do_somethin
我需要开发一个类似于 Android Play 商店应用程序或类似 this app 的应用程序.我阅读了很多教程,发现几乎每个教程都有与 this one 类似的例子。 . 我已经开始使用我的应用程
考虑一个表示“事件之间的时间”的列: (5, 40, 3, 6, 0, 9, 0, 4, 5, 18, 2, 4, 3, 2) 我想将这些分组到 30 个桶中,但桶会重置。期望的结果: (0, 1,
我是一名优秀的程序员,十分优秀!