Я искал технику программирования, которая обеспечивала бы, чтобы переменные, используемые для бенчмаркинга (без наблюдаемых побочных эффектов), не были оптимизированы компилятором
Это дает некоторую информацию, но в итоге я использовал 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, но выглядит как более чистое решение - не переносимо)