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

자유게시판
세상 살아가는 이야기들을 나누는 사랑방입니다.
[29092] Re:Re:Re: No!!!. 엠바 컴파일러만 불가능
빌더(TWx) [builder] 1730 읽음    2022-03-17 00:40
질문 님이 쓰신 글 :
: 확실히 이해하고 있지 못해서 아리송했었는데
: 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!!!. 엠바 컴파일러만 불가능 봄이다 1563 2022/03/17
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.