olbbemi   2년 전

Init() 함수에서 sort  수행하는데 sort에 오버로드된 함수가 없다고 자꾸 뜨는데. 뭐가 문제인가요..

c++ 배우면서 코드 연습하고잇는데 참 어렵습니다. 책이나 인터넷 검색했는데 안나와서 질문드려봅니다.

lvalue   2년 전

sort(v.begin(), v.end(), cmp);에서 cmp는 class DAY의 멤버함수로 선언되어 있습니다. 멤버함수는 호출하기 위해서는 인스턴스가 필요합니다. cmp를 static으로 선언해주거나 전역으로 바꾸면 문제가 해결됩니다.

olbbemi   2년 전

하나만 더 여쭤봐도 될까요?

똑같은 코드인데 단순히 절차식? ( c 코드 )  와 클래스를 사용했다 차이 뿐인데 시간차이가 의외로 많이나네요. 한 80ms 정도?

객체를 생성하는 차이정도인가요? 궁극적으로 무엇떄문에 저정도로 시간차이가 발생하는지 궁금합니다.

아래 코드 첨부해드릴께요



lvalue   2년 전

vector::resize()를 호출하느냐의 차이인 것 같은데요. resize()를 호출하는 경우에는 GCC에서 내부적으로 std::vector<DAY::INFO, std::allocator<DAY::INFO> >::_M_default_append(unsigned long)를 이용해서 할당을 하는데, 생성자에서 크기를 지정한 경우에는

void std::__unguarded_linear_insert<__gnu_cxx::__normal_iterator<INFO*, std::vector<INFO, std::allocator<INFO> > >, __gnu_cxx::__ops::_Val_comp_iter<bool (*)(INFO const&, INFO const&)> >(__gnu_cxx::__normal_iterator<INFO*, std::vector<INFO, std::allocator<INFO> > >, __gnu_cxx::__ops::_Val_comp_iter<bool (*)(INFO const&, INFO const&)>)

라는 좀 더 Optimize된 내부 루틴을 이용해서 초기화를 합니다. constructor는 초기 상태에 컨데이너가 비어 있다고 assume을 할 수 있어서 이런 Optimization이 가능하지 않나 조심스럽게 추측해 봅니다. resize()는 이미 있는 원소들에 대해서 처리를 해줘야 하니까요.


클래스를 사용했냐 안 했냐와는 관련이 적고요, 이 문제를 해결하기 위해서는 다음과 같이 initialization list를 사용하면 됩니다. 이렇게 하면 멤버변수에 대한 생성자를 호출할 수 있습니다.

lvalue   2년 전

참고로 gcc.godbolt.org 사이트를 이용하면 performance 관련해서 분석하기 편리합니다.

olbbemi   2년 전

감사합니다. 역시 많이 어렵군요 ㅋㅋ 좀더 공부해보겠습니다.

댓글을 작성하려면 로그인해야 합니다.