LINUX.ORG.RU

История изменений

Исправление 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.