我有这个程序:
int main(){
while(1) printf("Hi\n");
}
Run Code Online (Sandbox Code Playgroud)
这真的重复了吗?如果我把while(1),没有printf,将是相同的重复次数?如果不是永远,当堆栈溢出?该计划:
int main(){
loop:;
printf("Hi\n");
goto loop;
}
Run Code Online (Sandbox Code Playgroud)
和第一个一样?如果没有什么区别?
你的两个程序是等价的.一个例子:
#include <stdio.h>
void f1(void)
{
while(1)
printf("Hi\n");
}
void f2(void)
{
loop:
printf("Hi\n");
goto loop;
}
Run Code Online (Sandbox Code Playgroud)
编译它:
cc -O3 -c -o example.o example.c
Run Code Online (Sandbox Code Playgroud)
查看输出二进制文件:
example.o:
(__TEXT,__text) section
_f1:
0000000000000000 pushq %rbp
0000000000000001 movq %rsp, %rbp
0000000000000004 pushq %rbx
0000000000000005 pushq %rax
0000000000000006 leaq L_str1(%rip), %rbx ## literal pool for: "Hi"
000000000000000d nopl _f1(%rax)
0000000000000010 movq %rbx, %rdi
0000000000000013 callq _puts
0000000000000018 jmp 0x10
000000000000001a nopw _f1(%rax,%rax)
_f2:
0000000000000020 pushq %rbp
0000000000000021 movq %rsp, %rbp
0000000000000024 pushq %rbx
0000000000000025 pushq %rax
0000000000000026 leaq L_str1(%rip), %rbx ## literal pool for: "Hi"
000000000000002d nopl _f1(%rax)
0000000000000030 movq %rbx, %rdi
0000000000000033 callq _puts
0000000000000038 jmp 0x30
Run Code Online (Sandbox Code Playgroud)
请注意,它们包含相同的说明.