Тема: Проблема з шаблонами
Доброго дня. Недавно зіткнувся з досить дивною проблемою, пов'язаною з шаблонами. Створив окремий проект(Visual C++ 2015), щоб максимально загально її протестувати. Ось код:
#include <fstream>
#include <chrono>
using namespace std;
template<int Foo>
int g(int num)
{
return f<Foo>(num);
}
template<int Foo>
int f(int num)
{
if (num == 0)
return Foo;
return num + f<Foo>(num - 1);
}
int foo(void)
{
f<1>(0); // Fix
}
int main(void)
{
int a(0);
ofstream out("log.txt");
for (int i = 0; i < 5; ++i)
{
auto start = chrono::high_resolution_clock::now();
for (int i = 0; i < 70000; ++i)
a += g<1>(i);
auto end = chrono::high_resolution_clock::now();
out << chrono::duration_cast<chrono::milliseconds>(end - start).count() << "ms elapsed " << a << '\n';
}
out.close();
return 0;
}
Проблема в тому, що якщо закоментувати рядок Fix у функції foo, швидкодія програми несподівано погіршується. Ось результат роботи програми(вміст log.txt) спочатку:
і після коментування рядка Fix:
Чому так відбувається? Наскільки я розумію, цей рядок не має впливати на роботу програми. Тут якась помилка в коді, чи це можуть бути особливості компілятора?