- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
先声明变量再赋值和直接在编译后的函数中声明并赋值有区别吗?编译后的函数是否执行相同的工作?例如,它是否仍然读取参数、声明变量然后赋值,或者编译版本中的两个示例之间是否存在差异?
示例:
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/
几个月前,我做了一个功能,我的应用程序正在等待用户文档并做出相应的响应。直到我对项目进行优化并将其更新到最新版本之前,它一直是一种魅力。 如果存在用户文档,则流将产生该文档并关闭该流。 如果云Fire
Stack Overflow 有几个 examples其中函数首先获得可升级锁,然后通过升级获得独占访问。我的理解是,如果不小心使用,这可能会导致死锁,因为两个线程可能都获得了可升级/共享锁,然后都尝
这个问题在这里已经有了答案: MVC 4 Code First ForeignKeyAttribute on property ... on type ... is not valid (1 个回答
以下是部分代码。我需要在 finally 子句中关闭资源。我需要先调用 closeEntry() 还是 close()?我收到一些错误消息。 Error closing the zipoutjava.
我想使用 RxJS-DOM 观察 mousewheel 事件,这样当第一个事件触发时,我转发它然后删除所有值,直到后续值之间的延迟超过先前指定的持续时间。 我想象的运算符可能看起来像: Rx.DOM.
版本似乎与安装的不同。 我在 npm install 上收到警告 我将二进制文件安装到我的家庭/开发目录中,但它不适用于 sudo。所以我安装了apt。 (注意:我并没有真正安装,我提取并将路径放在/
我正在尝试展示 GAN 网络在某些指定时期的结果。打印当前结果的功能以前与 TF 一起使用。我需要换成 pytorch。 def show_result(G_net, z_, num_epoch, s
我是一名优秀的程序员,十分优秀!