Это дело о выходе из строя?
Рассмотрим код ниже.
#include <iostream>
#include <random>
#include <chrono>
#include <memory>
const int N = 1 << 28;
int main()
{
const int seed = 0;
std::mt19937 gen;
std::uniform_real_distribution<double> dis;
std::normal_distribution<double> normal;
std::unique_ptr<bool[]> array = std::unique_ptr<bool[]>(new bool[N]);
for (int i = 0; i < N; i++)
{
if (dis(gen) > 0.5)
array[i] = true;
else
array[i] = false;
}
int sum = 0;
std::chrono::high_resolution_clock::time_point t1 = std::chrono::high_resolution_clock::now();
for (int i = 0; i < N; i++)
{
if (array[i])
sum++;
}
auto t2 = std::chrono::high_resolution_clock::now();
std::cout << std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count() << " microsecond" << std::endl;
std::cout << sum << std::endl;
sum = 0;
t1 = std::chrono::high_resolution_clock::now();
for (int i = 0; i < N; i++)
{
sum+=array[i];
}
t2 = std::chrono::high_resolution_clock::now();
std::cout << std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count() << " microsecond" << std::endl;
std::cout << sum << std::endl;
}
Если я прокомментирую строки
std::cout << sum << std::endl;
тогда время выполнения будет отображаться как нули (или достаточно близко). Я проверял это на разных компиляторах, включая icpc, icl (v19.1.2) и g++ ( v9.2) с флагом компиляции O3.
Это пример нестандартного (динамического) исполнения?
1 ответ
Без линий
std::cout << sum << std::endl;
Компилятор поймет, что удаление этого
for (int i = 0; i < N; i++)
{
if (array[i])
sum++;
}
не имеет наблюдаемого эффекта (то же самое верно для обоих циклов, которые вычисляются
sum
). Следовательно, и это
for (int i = 0; i < N; i++)
{
if (dis(gen) > 0.5)
array[i] = true;
else
array[i] = false;
}
могут быть удалены без видимого эффекта.
Это пример так называемого правила "как если бы". Короче говоря, пока наблюдаемое поведение не меняется, компилятор может делать что угодно. Для получения дополнительных сведений см. Что такое правило "как если бы"?
Кстати, измерение времени выполнения не считается наблюдаемым поведением программы.