gpt4 book ai didi

c - 先声明变量还是直接声明变量,有区别吗?

转载 作者:行者123 更新时间:2023-12-01 23:06:43 25 4
gpt4 key购买 nike

先声明变量再赋值和直接在编译后的函数中声明并赋值有区别吗?编译后的函数是否执行相同的工作?例如,它是否仍然读取参数、声明变量然后赋值,或者编译版本中的两个示例之间是否存在差异?

示例:

    void foo(u32 value) {

u32 extvalue = NULL;

extvalue = value;

}

相比

    void foo(u32 value) {

u32 extvalue = value;

}

我的印象是,如果您查看编译后的代码,这两个函数之间没有区别,例如它们看起来相同,我将无法区分哪个是哪个。

最佳答案

这当然取决于编译器和优化级别。

愚蠢的编译器/低优化级别,当它看到:

  u32 extvalue = NULL;
extvalue = value;

可以设置为NULL,然后设置为下一行的value

由于 extvalue 没有在中间使用,所以 NULL 初始化是无用的,大多数编译器直接设置为 value 作为一种简单的优化

请注意,声明变量本身并不是真正的指令。编译器只是分配自动内存来存储这个变量。

我测试了一个带有和不带有赋值的简单代码,结果是 diff使用带有 -O0 (不优化任何内容)标志的 gcc 编译器 6.2.1 时出现错误:

 #include <stdio.h>
void foo(int value) {

int extvalue = 0;
extvalue = value;

printf("%d",extvalue);
}

拆解:

Disassembly of section .text:

00000000 <_foo>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 ec 28 sub $0x28,%esp
6: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) <=== here we see the init
d: 8b 45 08 mov 0x8(%ebp),%eax
10: 89 45 f4 mov %eax,-0xc(%ebp)
13: 8b 45 f4 mov -0xc(%ebp),%eax
16: 89 44 24 04 mov %eax,0x4(%esp)
1a: c7 04 24 00 00 00 00 movl $0x0,(%esp)
21: e8 00 00 00 00 call 26 <_foo+0x26>
26: c9 leave
27: c3 ret

现在:

 void foo(int value) {

int extvalue;
extvalue = value;

printf("%d",extvalue);
}

拆解:

Disassembly of section .text:

00000000 <_foo>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 ec 28 sub $0x28,%esp
6: 8b 45 08 mov 0x8(%ebp),%eax
9: 89 45 f4 mov %eax,-0xc(%ebp)
c: 8b 45 f4 mov -0xc(%ebp),%eax
f: 89 44 24 04 mov %eax,0x4(%esp)
13: c7 04 24 00 00 00 00 movl $0x0,(%esp)
1a: e8 00 00 00 00 call 1f <_foo+0x1f>
1f: c9 leave
20: c3 ret
21: 90 nop
22: 90 nop
23: 90 nop

0 init 已经消失。在这种情况下,编译器没有优化初始化。

如果我切换到 -O2 (良好的优化级别),则两种情况下的代码都是相同的,编译器发现初始化是不必要的(仍然,无声,没有警告):

   0:   55                      push   %ebp
1: 89 e5 mov %esp,%ebp
3: 83 ec 18 sub $0x18,%esp
6: 8b 45 08 mov 0x8(%ebp),%eax
9: c7 04 24 00 00 00 00 movl $0x0,(%esp)
10: 89 44 24 04 mov %eax,0x4(%esp)
14: e8 00 00 00 00 call 19 <_foo+0x19>
19: c9 leave
1a: c3 ret

关于c - 先声明变量还是直接声明变量,有区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48203848/

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