История изменений
Исправление
dzidzitop,
(текущая версия)
:
Рантайм - это все процессы, происходящие во время выполнения программы. libс - это runtime support library, а не рантайм. Но в общем не суть.
Компилятор может делать всё, что ему не запрещено. Такие оптимизации ему не запрещены.
Это как максимум можно заменить на частичный мемсет,
и это одно из возможных поведений.
А если ты хочешь использовать маллок для префолта, а потом не юзать эту память - у тебя что-то явно пошло не так
Псевдокод (сигнатуры не помню - не в них суть)
int *data = (int *)malloc(100500 * sizeof(int));
memset(data, 100500, 0);
for (volatile unsigned long long i = 0; i < 10000000000000000000llu; ++i);
data[100000] = (int) rand();
// use data[100000];
int x = data[100000];
Гарантий, что память будет в полном пользовании программы перед циклом - нет. Т.е. через 100 лет, когда цикл пройдёт, может быть фриз на обращении к памяти после цикла. А сам код на месте цикла может запускать какую-то производственную процедуру, и после него код должен работать как часы.
А компилятору можно выкинуть memset, т.к. этот memset не имеет побочных эффектов с точки зрения компилятора языка C.
Исправление
dzidzitop,
:
Рантайм - это все процессы, происходящие во время выполнения программы. libс - это runtime support library, а не рантайм. Но в общем не суть.
Компилятор может делать всё, что ему не запрещено. Такие оптимизации ему не запрещены.
Это как максимум можно заменить на частичный мемсет,
и это одно из возможных поведений.
А если ты хочешь использовать маллок для префолта, а потом не юзать эту память - у тебя что-то явно пошло не так
Псевдокод (сигнатуры не помню - не в них суть)
int *data = (int *)malloc(100500 * sizeof(int));
memset(data, 100500, 0);
for (volatile unsigned long long i = 0; u < 10000000000000000000llu; ++i);
data[100000] = (int) rand();
// use data[100000];
int x = data[100000];
Гарантий, что память будет в полном пользовании программы перед циклом - нет. Т.е. через 100 лет, когда цикл пройдёт, может быть фриз на обращении к памяти после цикла. А сам код на месте цикла может запускать какую-то производственную процедуру, и после него код должен работать как часы.
А компилятору можно выкинуть memset, т.к. этот memset не имеет побочных эффектов с точки зрения компилятора языка C.
Исходная версия
dzidzitop,
:
Рантайм - это все процессы, происходящие во время выполнения программы. libс - это runtime support library, а не рантайм. Но в общем не суть.
Компилятор может делать всё, что ему не запрещено. Такие оптимизации ему не запрещены.
Это как максимум можно заменить на частичный мемсет,
и это одно из возможных поведений.
А если ты хочешь использовать маллок для префолта, а потом не юзать эту память - у тебя что-то явно пошло не так
Псевдокод (сигнатуры не помню - не в них суть)
int *data = (int *)malloc(100500 * sizeof(int));
memset(data, 100500, 0);
for (volatile long long i = 0; u < 10000000000000000000llu; ++i);
data[100000] = (int) rand();
// use data[100000];
int x = data[100000];
Гарантий, что память будет в полном пользовании программы перед циклом - нет. Т.е. через 100 лет, когда цикл пройдёт, может быть фриз на обращении к памяти после цикла. А сам код на месте цикла может запускать какую-то производственную процедуру, и после него код должен работать как часы.
А компилятору можно выкинуть memset, т.к. этот memset не имеет побочных эффектов с точки зрения компилятора языка C.