Рассмотрим следующую схему. У нас есть 3 файла:
main.cpp:
int main() {
clock_t begin = clock();
int a = 0;
for (int i = 0; i < 1000000000; ++i) {
a += i;
}
clock_t end = clock();
printf("Number: %d, Elapsed time: %f\n",
a, double(end - begin) / CLOCKS_PER_SEC);
begin = clock();
C b(0);
for (int i = 0; i < 1000000000; ++i) {
b += C(i);
}
end = clock();
printf("Number: %d, Elapsed time: %f\n",
a, double(end - begin) / CLOCKS_PER_SEC);
return 0;
}
class.h:
#include <iostream>
struct C {
public:
int m_number;
C(int number);
void operator+=(const C & rhs);
};
class.cpp
C::C(int number)
: m_number(number)
{
}
void
C::operator+=(const C & rhs) {
m_number += rhs.m_number;
}
Файлы скомпилированы с использованием clang++ с флагами -std=c++11 -O3
.
То, что я ожидал, было очень похоже на результаты производительности, поскольку я думал, что компилятор оптимизирует операторов, которые не будут называться функциями. Реальность была немного иной, вот результат:
Number: -1243309312, Elapsed time: 0.000003
Number: -1243309312, Elapsed time: 5.375751
Я немного поиграл и узнал, что если я вставляю весь код из класса. * в main.cpp скорость резко улучшается, а результаты очень похожи.
Number: -1243309312, Elapsed time: 0.000003
Number: -1243309312, Elapsed time: 0.000003
Чем я понял, что это поведение, вероятно, связано с тем фактом, что компиляция main.cpp и class.cpp полностью разделена и, следовательно, компилятор не может выполнить адекватную оптимизацию.
Мой вопрос: Есть ли способ сохранить 3 файлную схему и до сих пор достичь уровня оптимизации, как если бы файлы были объединены в один и скомпилированы? Я кое-что прочитал о "сборках единства", но это похоже на перебор.