C++에선 생성자 내부에서 대입을 통해 멤버를 정의하는 방법보단 멤버 이니셜라이저라는 특수한 문법으로 정의를 해주는 것을 권장한다. 성능면에서 전자보단 후자가 상대적인 이득을 본다는 것인데, 다른 블로그를 찾아봐도 "어느정도 " 차이가 나는지는 없어 짤막하게 테스트 해보려고 한다.
#include <iostream>
#include <thread>
#include <time.h>
using namespace std;
class MyClass
{
public:
MyClass() = delete;
MyClass(int number)//이니셜라이저를 사용하지 않고, 대입을 통해 초기화
{
m_number1 = number;
m_number2 = number;
m_number3 = number;
m_number4 = number;
}
private:
int m_number1;
int m_number2;
int m_number3;
int m_number4;
};
class MyClass2
{
public:
MyClass2() = delete;
MyClass2(int number) ://이니셜라이저를 통해 초기화
m_number1(number),
m_number2(number),
m_number3(number),
m_number4(number)
{
}
private:
int m_number1;
int m_number2;
int m_number3;
int m_number4;
};
int main()
{
bool ThreadDone1 = false;
bool ThreadDone2 = false;
thread Thread1([&ThreadDone1]()
{
clock_t start = clock();
for (int i = 0; i < INT_MAX; i++)
{
MyClass a(5);
}
clock_t end = clock();
std::cout << "Thread1 done Time : " << double(end - start) / CLOCKS_PER_SEC << "\n";
ThreadDone1 = true;
});
Thread1.detach();
thread Thread2([&ThreadDone2]()
{
clock_t start = clock();
for (int i = 0; i < INT_MAX; i++)
{
MyClass2 a(5);
}
clock_t end = clock();
std::cout << "Thread2 done Time : " << double(end - start) / CLOCKS_PER_SEC << "\n";
ThreadDone2 = true;
});
Thread2.detach();
while (ThreadDone1 != true || ThreadDone2 != true)
{
}
}
스레드 1번은 단순 대입 초기화, 스레드2번은 멤버 이니셜라이저를 이용한 초기화를 해주는 클래스를 반복 생성한다.
테스트 1번
테스트 2번
테스트 3번
대략 6~9%정도의 성능 차이가 발생한다.
C++의 말대로, 정의해주는 위치만 변경되었을 뿐인데 명확한 성능 차이를 보인다. 습관을 들여서라도 멤버 이니셜라이저를 자주 사용해야겠다는 생각이 들었다.