얼마전 새로운 사실을 알게된것 같다.
Effective C++ 에서 봤던대로 초기화는 초기화 리스트에서 진행해야한다. 그렇게 봤기 떄문이다.
그렇기에 최대한 모든 맴버 변수를 초기화 리스트에 넣었다. 하지만 의문이 든것도 사실이다.
맴버 변수가 객체로 이루어져있으면 초기화 리스트에서 진행하는게 맞아보였다 .하지만 기본 자료형은 어떨까?
단순 자료형만 있고 이것을 그냥 0으로 초기화하는것인데 이게 차이가 있을까 하는것이였다. 물론 객체가 존재하면 얘기는 다르겠지만 단순 자료형만으로 이루어진 클래스일때는 어떨까 하는 것이였다.
그러던중 어셈블리로 코드를 볼 기회가 생겼고 그것에서 기본 자료형만 있을때는 차이가 없다는 결과가 나왔다.
class A
{
public:
A():m_Num(0),
m_double(0.0)
{}
private:
int m_Num;
double m_double;
};
class B
{
public:
B()
{
m_Num = 0;
m_double = 0.0;
}
private:
int m_Num;
double m_double;
};
코드는 위와 같이 구성을 했고 해당 부분을 어셈블리로 보면
this$ = 8
A::A(void) PROC ; A::A, COMDAT
mov QWORD PTR [rsp+8], rcx
mov rax, QWORD PTR this$[rsp]
mov DWORD PTR [rax], 0
mov rax, QWORD PTR this$[rsp]
xorps xmm0, xmm0
movsd QWORD PTR [rax+8], xmm0
mov rax, QWORD PTR this$[rsp]
ret 0
A::A(void) ENDP ; A::A
this$ = 8
B::B(void) PROC ; B::B, COMDAT
mov QWORD PTR [rsp+8], rcx
mov rax, QWORD PTR this$[rsp]
mov DWORD PTR [rax], 0
mov rax, QWORD PTR this$[rsp]
xorps xmm0, xmm0
movsd QWORD PTR [rax+8], xmm0
mov rax, QWORD PTR this$[rsp]
ret 0
B::B(void) ENDP ; B::B
위처럼 결과값이 같은것으로 나왔다. 혹시나 해서 객체로도 테스트를 해보았지만 결과는 초기화 리스트를 써야한다는 것이였다.
이걸로 결과가 차이가 없다는걸 확인하긴 하였지만 그래도 두가지 방식을 사용하면 햇갈릴수 있으므로 초기화 리스트를 쓰는게 나은 선택일 것이다.
'C++' 카테고리의 다른 글
람다함수를 이용한 Vector 탐색 소스 (0) | 2016.02.19 |
---|---|
xmllite 설정하기 (0) | 2013.08.15 |