c - 为什么 gcc 编译器在这两种情况下表现不同?

标签 c gcc while-loop compiler-optimization

我有两个类似的 while 循环,我很好奇为什么 C 编译器在每种情况下表现不同。

详细信息:编译器:x86-64 gcc 8.2

选项:-O3

void use() 
{ 
    int* ptr;
    while (*ptr == 6);
}

Assembly:

use:
        cmp     DWORD PTR ds:0, 6
        jne     .L1
.L3:
        jmp     .L3
.L1:
        ret

正如我们所见,编译器仍然生成无限循环。但是,如果我使用这个:

void use() 
{ 
    int p;
    while (p == 6);
} 

Assembly:

use:
        ret

我希望它们都不会生成 while 循环。我的猜测是,对于第一个版本,由于我们不可能知道 ptr 指向什么,因此我们不能对 *ptr 做出任何假设。但是我们是否可以对第二个版本做出类似的论证,其中 p 只是一个局部变量,即 p 可以包含任何内容?

最佳答案

两个版本都有未定义的行为,因为您访问和读取未初始化的变量。因此,编译器可以生成任何代码。

关于c - 为什么 gcc 编译器在这两种情况下表现不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53445819/

相关文章:

java - java在指定范围之间连续循环

c - C中的指针的自由函数如何工作?

python - 用于 Python 编译的动态库 - 无目录

c - C 中的信号处理

c - 架构冲突?在 mac 上找不到体系结构 x86_64 的符号

python - gcc 找不到 Python.h

Python:Scrapy start_urls 列表能够处理 .format()?

mysql - 在 sp mysql 的 while 循环中插入 select 语句

c - 在C中使用指针交换两个数字

c - 如何确保只有一个守护程序副本在运行?