버그 해결을 위한 모든 질문을 던져
+2 votes
306 views

 

class ABC
{
	int *m_N;
	int m_size;
public:
	ABC()
	{
		m_N = new int[100];
		m_size = 100;
	}
	ABC(int nSize) {
		m_N = new int[nSize];
		m_size = nSize;
		printf("%x\n", this);
	}
	~ABC()
	{
		delete[] m_N;
	}
	ABC(const ABC& rhs)
	{
		m_size = rhs.m_size;
		m_N = new int[m_size];
		memcpy(m_N, rhs.m_N, sizeof(int)*m_size);
	}
	ABC(ABC&& rhs)
	{
		m_size = rhs.m_size;
		m_N = rhs.m_N;
		rhs.m_N = nullptr;
	}
};
int main()
{
	ABC aa = ABC(10000);
    return 0;
}

어셈을 어느정도라도 볼줄 안다면.. ㅠㅠ 알수있을꺼 같은데 ㅠ 어셈을 잘 볼줄몰라서.. ㅠㅠ(진짜 공부해야할듯)

ABC aa = ABC(10000);  

이렇게 하면 저는 

ABC aa의 생성자 호출 , ABC(10000)생성자 호출,  ABC aa = ABC(10000);에서 move constructor 호출 

이렇게 될줄알았는데 실제로는 아래처럼되더군여"ABC(10000)의 생성자 호출" 이게 끝입니다. 

ABC aa의 생성자가 호출이 안되어서 move constructor이 호출안된거라면, 이해가 가지만  문제는 ABC aa의 생성자가 호출이 되지 않는 이유를 모르겠습니다. 

어떠한 대입연산 copy constructor move constructor 도 없는거 같은데 aa가 ABC(10000);의 값을 가지게 되는지도 궁금합니다.

질문 읽어주셔서 감사합니다~

asked (8 point) , 306 views
질문과는 상관없지만 작성하신것처럼 테스트용 더미 클래스를 만들어서 흐름을 파악하는 습관은 충분히 훌륭한 방법이라고 생각합니다. 언어의 기능적인 흐름을 파악하기 위해서 굳이 어셈까지 읽을 필요는 없겠죠..

1 답변

+4 votes
우수 답변
컴파일러를 어떤걸 사용했는지 궁금합니다.

저도 처음에는 이 질문 대수롭지 않게 생각했다가 테스트 해보니 제 생각하고 다르게 나오더군요

예전에 Visual Studio 2010으로 질문의 코드와 비슷한 것을 실행했을 때

인자 있는 생성자, move 생성자

이렇게 2개가 호출 되었는데 Visual Studio 2017에서 해보니 인자 있는 생성자 하나만 실행되더군요.

 

그래서 이리저리 구글링 해보니 이게 컴파일러 최적화에 의해서 불필요한 생성자 호출을 안할 수 있다는 것을 찾았습니다.

C++ 언어 사양에서 copy elision 이라는 것이 있는데 이것을 컴파일러에서 적용하면 불필요한 생성자 호출을 하지 않습니다.

https://en.cppreference.com/w/cpp/language/copy_elision

 

만약 copy elision 컴파일러 최적화를 빼고 싶다면 gcc의 경우 컴파일 옵션으로 아래의 옵션을 주면 최적화 하지 않습니다.

-fno-elide-constructors

 

제가 테스트를 위해 코드 조금 수정한 것으로 아래에서 확인할 수 있습니다.

https://wandbox.org/permlink/Dqss90YKH6OGlJo9
answered (116 point)
선택됨
사용한 컴파일러는 위에서 말씀하신 visual studio 2017 컴파일러입니다.

명쾌한 답변 감사합니다!!
혹시나 싶어 Visual c++ 에서도 비슷한 옵션이 있는지 찾아 봤지만, 못 찾았습니다.

그냥 알고만 있어야겠네요.

버그 해결을 위해 도움을 구하고, 도움을 주세요. 우리는 그렇게 발전합니다.

throw bug 는 프로그래밍에 대한 전분야를 다룹니다. 질문,논의거리,팁,정보공유 모든 것이 가능합니다. 프로그래밍과 관련이 없는 내용은 환영받지 못합니다.

200 질문
313 answers
337 댓글
325 users