요렇게 만들어놓으면 IDE 린터에서 s 레퍼런스 말고 패스바이밸류 한다음 std::move해서 멤버 초기화에 넣으라는데 이유가 뭔가요? 패스바이밸류하면 복사생성 1회 후 멤버초기화시 이동생성 1회 아닌가요? 레퍼런스로 받고 그대로 멤버초기화에 넣으면 복사 1회만 되는거 아님요?
[%] 형님들 모오던 c++ 질문좀요
익명(175.223)
2019-12-17 17:37
추천 0
댓글 11
다른 게시글
-
일본 IT대기업들 학벌 엄청 따지네 [7][%] 익명(218.156) | 19.12.17추천 0
-
pfds okasaki 솔루션 [4][%] 다믜(damhiya) | 19.12.17추천 0
-
왜 아마존 aws 넘는 클라우드 컴퓨팅은 못나오고 있을까 [7][%] 퀘이사(117.17) | 19.12.17추천 0
-
nfa 최적화 어떻게 해요?? [14][질문] 기괴공학도(mecheng98) | 19.12.17추천 0
-
컴퓨터 구조 및 프로세서 설계 쪽 대학원 다니는 썰 [21][%] 익명(180.64) | 19.12.17추천 0
-
갑자기 갤 분위기가 전문적으로 바뀌었네 [6][%] ㅇㄹ(rerereq) | 19.12.17추천 1
-
되게 챌린저블해 보이는 토픽 생각나서 리서치해보니까[%] 익명(175.223) | 19.12.17추천 0
-
컴파일러 시험을 이틀 앞두고 드디어.. [3][%] 익명(59.24) | 19.12.17추천 0
-
리눅스 메인테이너 vs 탑급 학회 3편 [2][%] 익명(110.70) | 19.12.17추천 0
-
오픈소스 커미터 vs SCI 논문 한 편 [10][%] 익명(182.224) | 19.12.17추천 0
move는 복사자체를 안하게 할때 쓰는거
위에서 말하는 move는 일단 s 받은 다음에 다시 멤버변수에 넣을때 하는 이디엄이고 원문이 오해하는건 그 이전임
아 잘못읽은듯
Example(std::string s) 에서 s가 반드시 복사로 일어날거라는 전제부터 잘못됐음 Example example{produce_string()) 처럼 생성자(사실 생성자가 아니라 어느 함수나)에 rvalue 아규먼트 넣으면 복사가 아니라 이동이 일어남
그러니 rvalue를 넣으면 생성자 인자로 받을 때 이동 1회, 멤버변수에 넣을 때 이동 1회 해서 총 이동 2회가 되니 복사 1회 이동 1회보다 이득이지
lvalue로 받으면 복사 1회 이동 1회라 원문의 복사 1회보다 손해지만, 이동이 빠른 타입이라면 큰 손해가 아님 그래서 이 이디엄은 이동 생성이 값싼 타입에서 쓰라고 추천되는 것
결론은 이펙티브 모던 씨플플 읽어라
EMC++에 이런 것도 있었구나.. 다시 읽어봐야겠네
이거랑 비슷한 문제로 함수 템플릿 만들 때 T&& 말고 그냥 T로 하는게 나을 때가 많다는 것이 있음 이건 린팅에서 검사해주기도 힘든 문제라 어떤 타입을 주로 받게될지 잘 고려해서 정해야함
T&& 사용하면 rvalue로 넣어도 그에 맞게 처리하게 만들텐데 위문제랑은 다르지 T&&에 rvalue 넣으나 lvalue 넣으나 그순간에는 복사 아닌데
그냥 레퍼런스를 붙여할 때와 아닐 때를 잘 구별해야한다는 넓은 관점에서 말한거임 템플릿에서 레퍼런스 붙으면 타입 처리에 신경써야할게 한두개가 아니라