Почему Visual Studio C++ компилятор не оптимизирует по умолчанию следующий фрагмент кода?C++ встроенные оптимизации сборки
#include "ctime"
#include "iostream"
#define BIG_NUM 10000000000
int main() {
std::clock_t begin = clock();
for (unsigned long long i = 0; i < BIG_NUM; ++i) {
__asm
{
nop
}
}
std::clock_t end = clock();
std::cout << "time: " << double(end - begin)/CLOCKS_PER_SEC;
std::cin.get();
}
Без _asm
блока, времени работы всегда равен 0, так как цикл «пропускается» полностью из-за оптимизации компилятора. С блоком _asm
требуется несколько секунд.
Есть ли какой-либо флаг компилятора для оптимизации встроенной сборки или для некоторых неясных причин это невозможно?
Это не скрытые, блоки asm обрабатываются как в основном черные ящики. – harold
c компиляторам не пытаются понять, что находится внутри блоков asm, они просто помещают их в правильное положение внутри своего собственного кода сборки, а затем перенаправляют все на ассемблер –
Когда вы добавляете блок '__asm', он предполагает, что вы знаете что вы делаете (что может быть не так) и не знает, что вы можете сделать внутри него, что мешает ему делать оптимизации. В противном случае вы получите очень непредсказуемый код. Для компилируемого кода нет ничего необычного в том, что он имеет очень неочевидную структуру/код, чтобы использовать преимущества конвейеров и других оптимизаций процессора. Ваша встроенная сборка бросает в нее ключ. –