gpt4 book ai didi

c++ - 为什么我的 C++ 编译器不优化这些内存写入?

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

我创建了这个程序。它除了使用处理能力外什么都不感兴趣。

使用 objdump -d 查看输出,即使在编译时,我也可以在接近尾声时看到三个 rand 调用和相应的 mov 指令与 O3。

为什么编译器没有意识到内存不会被使用而只是用 while(1){} 替换下半部分?我正在使用 gcc,但我最感兴趣的是标准的要求。

/*
* Create a program that does nothing except slow down the computer.
*/
#include <cstdlib>
#include <unistd.h>

int getRand(int max) {
return rand() % max;
}

int main() {
for (int thread = 0; thread < 5; thread++) {
fork();
}
int len = 1000;
int *garbage = (int*)malloc(sizeof(int)*len);
for (int x = 0; x < len; x++) {
garbage[x] = x;
}
while (true) {
garbage[getRand(len)] = garbage[getRand(len)] - garbage[getRand(len)];
}
}

最佳答案

因为 GCC 不够智能,无法对动态分配的内存执行此优化。但是,如果您将 garbage 更改为本地数组,GCC 会将循环编译为:

.L4:
call rand
call rand
call rand
jmp .L4

这只是重复调用 rand(这是必需的,因为调用有副作用),但优化了读取和写入。

如果 GCC 更聪明,它还可以优化 rand 调用,因为它的副作用只会影响任何以后的 rand 调用,在这种情况下没有没有。然而,这种优化可能会浪费编译器编写者的时间。

关于c++ - 为什么我的 C++ 编译器不优化这些内存写入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32854240/

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