Я искал технику программирования, которая обеспечивала бы, чтобы переменные, используемые для бенчмаркинга (без наблюдаемых побочных эффектов), не были оптимизированы компилятором
Это дает некоторую информацию, но в итоге я использовал folly и следующая функция
/**
* Call doNotOptimizeAway(var) against variables that you use for
* benchmarking but otherwise are useless. The compiler tends to do a
* good job at eliminating unused variables, and this function fools
* it into thinking var is in fact needed.
*/
#ifdef _MSC_VER
#pragma optimize("", off)
template <class T>
void doNotOptimizeAway(T&& datum) {
datum = datum;
}
#pragma optimize("", on)
#else
template <class T>
void doNotOptimizeAway(T&& datum) {
asm volatile("" : "+r" (datum));
}
#endif
Я хочу использовать выше, но у меня малое понимание его работы. Меня больше всего интересует часть, отличная от VС++, и почему/как строка
asm volatile("" : "+r" (datum));
создает не оптимизируемый контекст или , почему это то, что можно было бы выбрать для реализации такой вещи. Также было бы интересно сравнить два метода (я не знаю, как работает pragma optimize
, но выглядит как более чистое решение - не переносимо)