Я создал эту программу. Он не представляет интереса, но использует вычислительную мощность.Почему мой компилятор C++ не оптимизирует эту память?
Глядя на вывод с 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? –
'g ++ -O3 slowdown.cc' - это полная команда, которую я использую. –
Я думаю, вы могли бы утверждать, что получение другой псевдослучайной последовательности изменяет наблюдаемое поведение программы - если программа фактически выводит результат более позднего «rand()», который этого не делает. –