В CSAPP2e, когда демонстрируя «гора памяти», автор использовал следующий фрагмент кода:Какова цель использования ключевого слова volatile для предотвращения оптимизации в этом фрагменте кода?
double data[MAXELEMS]
/* $begin mountainfuns */
void test(int elems, int stride) /* The test function */
{
int i, result = 0;
volatile int sink;
for (i = 0; i < elems; i += stride)
result += data[i];
sink = result; /* So compiler doesn't optimize away the loop */
}
/* Run test(elems, stride) and return read throughput (MB/s) */
double run(int size, int stride, double Mhz)
{
double cycles;
int elems = size/sizeof(int);
test(elems, stride); /* warm up the cache */
cycles = fcyc2(test, elems, stride, 0); /* call test(elems,stride) */
return (size/stride)/(cycles/Mhz); /* convert cycles to MB/s */
}
Я не совсем понятно, почему мы используем летучими, чтобы избежать оптимизации в тесте() функции. Я видел в wikipedia, что ключевое слово volatile указывает, что значение может меняться между различными обращениями, даже если оно не изменяется, однако я не знаю, почему использовать volatile в этом примере, и если мы не будем использовать volatile , что случится?
Что бы это ни значилось для «горы памяти» (это очень неудобный перевод «кучи»?), Достаточно информации о 'volatile'. И это не предотвращает оптимизацию как таковую. – Olaf
Без назначения нет смысла вычислять * результат *, поэтому нет смысла выполнять цикл, поэтому нет смысла выполнять эту функцию, а тест занимает 0 микросекунд :) –