gpt4 book ai didi

c++ - C/C++ 不确定值 : Compiler optimization gives different output (example)

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:16:01 24 4
gpt4 key购买 nike

C/C++ 编译器(clang、gcc 等)似乎产生了与优化级别相关的不同 输出。您也可以查看本文中包含的在线链接。

http://cpp.sh/5vrmv (将输出从无更改为 -O3 以查看差异)。

基于下面的一段代码,有人可以解释我的几个问题吗:

#include <stdio.h>
#include <stdlib.h>

int main(void) {

int *p = (int *)malloc(sizeof(int));
free(p);
int *q = (int *)malloc(sizeof(int));
if (p == q) {
*p = 10;
*q = 14;
printf("%d", *p);
}
return 0;
}
  1. 是否确定执行将始终进入 if 语句?我们如何知道两个指针 p 和 q 的地址相同?
  2. 为什么没有优化输出 14,而 -O3 对于相同的指令输出 10

最佳答案

free(p);

这会将 p 的内容变成无效的指针值。

int *q = (int *)malloc(sizeof(int));

这一行与 p 无关。

if (p == q) {

这是实现定义的行为,因为p 有一个无效的指针值。

    *p = 10;

最后,出于与上述相同的原因,这是未定义行为。

C++ 标准 §3.7.4.2/4:

If the argument given to a deallocation function in the standard library is a pointer that is not the null pointer value (4.10), the deallocation function shall deallocate the storage referenced by the pointer, rendering invalid all pointers referring to any part of the deallocated storage. Indirection through an invalid pointer value and passing an invalid pointer value to a deallocation function have undefined behavior. Any other use of an invalid pointer value has implementation-defined behavior.

因此,您的问题的答案是:

Is it certain that the execution will always get into the if statement?

这取决于实现。 C++ 语言对此不作保证。

Why does no-optimization has output 14, while -O3 has output 10 for the same instructions?

因为取消引用无效指针时行为未定义。


在 C 中,比较本身是未定义的行为。 C 标准中的附录 J.2 列出了未定义行为的情况,该列表包括:

The value of a pointer to an object whose lifetime has ended is used.

您可能会发现以下问题(包括所有评论和答案)很有趣:Undefined, unspecified and implementation-defined behavior

关于c++ - C/C++ 不确定值 : Compiler optimization gives different output (example),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35744832/

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