gpt4 book ai didi

c++ - 在某些条件下(包括优化)非常奇怪的代码

转载 作者:可可西里 更新时间:2023-11-01 17:50:16 24 4
gpt4 key购买 nike

我有这段代码:

#include <stdio.h>     

void optimization_headache()
{
int t = 11;
int l[1047] = {0};
int u_lu[23] = {0};

int u = 0;

l[0] = 0;
l[1] = 0;

do {
u++;
//printf("Incrementing u, now u is %d\n", u);
u_lu[u + 1] = u - l[u + 1];
} while ((u < t * 2) && (l[u + 1] <= t));

printf("u = %d, l[u] = %d, t = %d, u_lu[u] = %d\n", u, l[u], t, u_lu[u]);
}

int main()
{
optimization_headache();

return 0;
}

在关闭优化的情况下编译 ($ gcc -Wall -Wextra -O0 main.c),代码编译,我得到以下输出:

u = 22, l[u] = 0, t = 11, u_lu[u] = 21

当我使用完全优化 ($ gcc -Wall -Wextra -O3 main.c) 进行编译时,程序挂起,并且 top 指示它正在使用 100% 的 CPU。它必须在 do while 循环中永远运行。

通过更改以下一项或所有内容,我可以让代码通过完全优化进行编译并正确运行:

1) 如果我注释掉 l[0] = 0; l[1] = 0;.

2) 如果我将 u 改为 volatile int

3) 如果我在 do while 循环中取消注释 printf

很明显,我不明白优化在做什么,以及为什么它会改变我的程序的行为。我可以选择上述解决方案之一来运行它,但我真的很想知道这里发生了什么。这对我来说太奇怪了。

(C++ 标签可能不合适,但我在使用 g++ 时也看到了相同的行为)

最佳答案

正如评论中所指出的,如果您调用 undefined behavior 可能会发生这种情况.

在您的情况下,这是相关部分:

int t = 11;    
int u_lu[23] = {0};

do {
u++;
u_lu[u + 1] = u - l[u + 1];
} while ((u < t * 2) /*...*/);

循环在 u 小于 22 时运行,因此它可以变为 21。但是在循环内,您将 u 递增两次并写入 u_lu[ 23]。这是一个然后分配的。

关于c++ - 在某些条件下(包括优化)非常奇怪的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34362737/

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