C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
분야별 포럼
C++빌더
델파이
파이어몽키
C/C++
프리파스칼
파이어버드
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

자유게시판
세상 살아가는 이야기들을 나누는 사랑방입니다.
[29093] Re:Re:Re:Re: No!!!. 엠바 컴파일러만 불가능
봄이다 [] 1562 읽음    2022-03-17 14:23
C++20 지원하는 Visual Studio 2022와 gcc로 테스트해보니
템플릿이 아닌 일반 함수도 perfect forwarding이 잘 되는것을 확인했습니다

엠바 C++ 컴파일러만 안되네요. 감사합니다.


빌더(TWx) 님이 쓰신 글 :
: 질문 님이 쓰신 글 :
: : 확실히 이해하고 있지 못해서 아리송했었는데
: : perfect forwarding이 template만 되고 일반 함수는 안되는 거였군요
: : 대단히 감사합니다. 복 받으실 거에요 ^^
: :
: :
: : 빌더(TWx) 님이 쓰신 글 :
: : : 질문 님이 쓰신 글 :
: : : : http://www.borlandforum.com/impboard/impboard.dll?action=read&db=free&no=28886
: : : :
: : : : C++빌더님께서 알려주신 버그패치 잘 쓰고있습니다.
: : : : Rad Studio 11 에서도 이 template 버그가 고쳐지지 않고 있던데 황당하네요.
: : : : 몇년째 버그를 방치하고 있다니
: : : : 소비자를 봉으로 보는 건지 뭐 이런 개발회사가 있는지 모르겠습니다.
: : : :
: : : : 제가 궁금한 건요.
: : : :
: : : : T&& t
: : : :
: : : : 버그패치를 보면 위와 같이 rvalue 레퍼런스를 이용하시던데요.
: : : : 그럼 옵티마이징을 위해서 perfect forwarding 이용할 법 한데 안쓰고 계셔서요
: : : : 특별한 이유가 있는 건지 궁금하네요.
: : :
: : :
: : :
: : :
: : :
: : : 답변:
: : :
: : :
: : : rvalue move semantic rule, perfect forwarding을 완전하게 이해하고 있지 못하다면...
: : : C++언어에 대한 공부가 전혀 되어 있지 않은 거고, C++ 프로그래머라고 할 수 없을 정도로
: : : 코드 최적화를 위한 굉장히 중요한 개념인데요.
: : :
: : : T&& t는 template Type Deduction Rule에 의해서 lvalue 와 rvalue 모두 받을 수 있는 레퍼런스 이므로
: : : 엄격하게 말하면 rvalue reference 가 아니고, universal reference 입니다.
: : :
: : : int&& ri = 7;
: : :
: : : 에서 ri는 rvalue로만 바인드 될 수 있는 rvalue reference 이지만...
: : :
: : : template <typename T>
: : : void foo(T&& t){}
: : :
: : : 와 같이 Indirect로 Type Deduction 이 적용되는 경우...
: : : 여기서 t는 rvalue reference가 아니고, lvalue와 rvalue 다 바인드 될 수 있는 universal reference 입니다.
: : :
: : :
: : : 
: : :
: : : 버그패치 코드에서 perfect forwarding을 적용하지 않은 것은...
: : :
: : : Format() 함수는 델파이로 구현되어 있는 함수에 불과하고...
: : : 델파이 파스칼 언어는... 코드 최적화를 위한 move semantic, perfect forwarding 개념 자체를
: : : 아예 갖고있지 않기 때문에 perfect forwarding 사용이 불가능 합니다.
: : :
: : : perfect forwarding 을 적용할 수 있으려면...
: : : 라이브러리가 rvalue move semantic rule을 지원하도록...
: : : C++로 구현되어 있어야 하죠.
: : :
: : : 델파이 파스칼 언어는 코드 최적화를 위한 그런 개념 자체가 없어요.
: : : 그래서 RTL도 속도를 낸답시고 단무지 같은 방법으로 어셈블리 코드를 잔뜩 쓰고 있죠.
: : :
: : : 델파이 파스칼은 Language specification이 간단해서 초보자들이 쉽게 사용할 수 있는 언어에 불과함.
: : :
: : :
: : :
: : : 이와같이 perfect forwarding이 불가능한 델파이 파스칼 언어의 한계에도 불구하고
: : : 버그패치 코드에서 T&& (univarsal reference)을 사용한 것은...
: : :
: : : 1. const, volatile 과 같은 qualifier 속성을 잃지 않으면서 파라미터를 전달할 수 있고
: : :
: : : 2. reference collapsing rule 에 의해서 template 파라미터가 lvaue reference 나 rvalue reference 가
: : :    될 수 있기 때문에 불필요한 복사가 일어나지 않도록 할수 있는
: : :
: : : C++언어의 랭귀지 파워를 활용하기 위한 것임..
: : :
: : :
: : :
:
:
:
: 답변:
:
:
: 이전 답변에서 간단하게 언급했듯이...
:
: perfect forwarding 이라는 메카니즘이 Indirect Type Deduction 시에 적용되는 것이므로
: 다음과 같이 template이 아닌, 일반 함수로도 가능 합니다.
:
: void foo(auto&& t)
: {
:    ...
:    std::forward<decltype(t)>(t);
: }
:
: 단, 조건이...
:
: Type Deduction Rule 확장 셋이 가능한 C++20 지원하는 컴파일러라야 합니다.
: C++20을 지원하지 않는 엠바 컴파일러로는 불가능 하지요.
:
:
: module, lazy range, template concept constraint, coroutine, joinable jthread 등등의 랭귀지 파워를
: C++20 지원하지 않는 엠바 컴파일러로는 불가능 합니다.
:
:
: 앞으로 C++23 이 나오면...
: 다음과 같이 람다를 이용한 perfect forwarding도 가능해 질 겁니다.
:
: (auto&& t) { goo(forward<decltype(t)>(t)); }(7); // perfect forwarding to r-value reference
:
: Lambda expression 에서 capture [] 부분 없이 사용 가능. (C++23)
:
:
:
:

+ -

관련 글 리스트
29089 C++빌더님. template 버그패치 잘 쓰고 있습니다. 질문 1849 2022/03/13
29090     Re: 델파이 파스칼 언어의 한계로 perfect forwarding이 불가능. 빌더(TWx) 2064 2022/03/15
29091         Re:Re: 일반 함수는 perfect forwarding이 안되는 거였군요 질문 1583 2022/03/16
29092             Re:Re:Re: No!!!. 엠바 컴파일러만 불가능 빌더(TWx) 1730 2022/03/17
29093                 Re:Re:Re:Re: No!!!. 엠바 컴파일러만 불가능 봄이다 1562 2022/03/17
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.