gpt4 book ai didi

c - 关于 c 中 'not a statment' 的优化?

转载 作者:太空狗 更新时间:2023-10-29 15:07:23 25 4
gpt4 key购买 nike

在学习编译器优化时,我在 LinuxGCC 下用 C 编写代码 gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5.1)
为了理解 C 中的 not a statement (nop)。我先写了两个代码 y.c 第二个 x.c生成它们的编译汇编代码 使用 gcc -S 选项。

拳头代码y.c

desktop:~$ cat y.c
main()
{
int i=0;
}
desktop:~$ gcc -S y.c
desktop:~$

第二个代码x.c

desktop:~$ cat x.c
main()
{
int i=0;

/* Loops and if*/
while(0);
for(;0;);
if(0);

/* Arithmetic Operations */
i * i;
i / i;
i - i;
i + i;
i % i;
+i;
-i;

/* Comparison operators */
i == i;
i != i;
i < i;
i > i;
i >= i;
i <= i;

/* Bitwise Operations*/
i ^ i;
i | i;
i & i;
~i;
i << i;
i >> i;

/* Address Operatins*/
&i;
*(&i);
(&i)[i];

/* Ternary conditional operation*/
i? i : i;

/* Other Operations*/
sizeof(i);
(char)i;

/* Not-Logical Operation*/
!i;

/* Logical AND , OR Operators */
// i && i; // Commented && operation
// i || i; // Commented || operation
}
desktop:~$ gcc -S x.c

注意:这次 x.c 中的最后两行被注释掉了。
正如我所料。它们生成的汇编代码没有区别。我使用 diff 命令比较了 x.sy.s

desktop:~$ diff x.s y.s
1c1
< .file "x.c"
---
> .file "y.c"
desktop:~$

但是当我在 x.c 中取消注释最后(或添加)两行时。

i && i;  
i || i;

再次使用-S 选项编译x.c 并与y.s 进行比较。

desktop:~$ tail  x.c  
sizeof(i);
(char)i;

/* Not-Logical Operation*/
!i;

/* Logical AND , OR Operators */
i && i; // unCommented && operation
i || i; // unCommented || operation
}
desktop:~$ gcc -S x.c
desktop:~$ diff x.s y.s
1c1
< .file "x.c"
---
> .file "y.c"
10,21d9
< movl -4(%ebp), %eax
< testl %eax, %eax
< je .L3
< movl -4(%ebp), %eax
< testl %eax, %eax
< .L3:
< movl -4(%ebp), %eax
< testl %eax, %eax
< jne .L8
< movl -4(%ebp), %eax
< testl %eax, %eax
< .L8:
desktop:~$

问题:
我只是不明白为什么表达式 i || ii && i 不等同于 'not a statement'

为什么编译器会将这两条语句转为可执行文件(我们可以用objdump反汇编得到相同的代码)。这两个表达式有什么特别之处。它们不包括 = 操作。

他们是否更改(设置/重置)CPU 标志寄存器?我觉得不是!

即使/除法运算被丢弃也可能导致被零除错误。

编辑:添加答案

i || 没有什么特别的ii && i 表达式。两者都等同于不是声明。并且可以通过 GCC 编译器 进行一些额外的努力来删除。

要删除它:-o2-o3 标志很有用:
这是我的尝试!

desktop:~$ gcc -o2 -S y.c 
desktop:~$ gcc -o2 -S x.c
desktop:~$ diff x.s y.s -y
.file "x.c" | .file "y.c"
.text .text
.p2align 4,,15 <
.globl main .globl main
.type main, @function .type main, @function
main: main:
pushl %ebp pushl %ebp
movl %esp, %ebp movl %esp, %ebp
popl %ebp | subl $16, %esp
> movl $0, -4(%ebp)
> leave

RHS 中的额外行是因为文件之间未对齐。

我还想补充一些信息,JAVAC# 编译器会在没有任何标志的情况下丢弃此表达式。

最佳答案

使用 -O2 启用优化,您应该会看到额外的代码消失了。

关于c - 关于 c 中 'not a statment' 的优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13566662/

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