[c++] ‘썽크’란 무엇입니까?

프로그래밍에서 (특히 C ++ 도메인에서) 사용되는 것을 보았고 그것이 무엇인지 전혀 모릅니다. 아마도 그것은 디자인 패턴이지만 틀릴 수 있습니다. 누구든지 썽크의 좋은 예를 줄 수 있습니까?



답변

A는 thunk일반적으로 함수라고하는 작은 코드를 말하며 작은 일을 한 다음 JUMP호출자에게 반환하는 대신 다른 위치 (보통 함수)로갑니다. JUMP 대상이 정상적인 함수라고 가정하면 반환되면 썽크의 호출자에게 반환됩니다.

썽 크는 많은 유용한 것들을 효율적으로 구현하는 데 사용될 수 있습니다

  • 프로토콜 변환-하나의 호출 규칙을 사용하는 코드에서 다른 호출 규칙을 사용하는 코드로 호출 thunk할 때 인수를 적절하게 변환하는 데 사용할 수 있습니다. 이것은 반환 규칙이 호환되는 경우에만 작동하지만 종종 그러한 경우가 있습니다

  • 가상 함수 처리-C ++에서 다중 상속 된 기본 클래스의 가상 함수를 호출 할 때 this올바른 위치를 가리 키도록 포인터를 수정해야합니다 . A는 thunk이 작업을 수행 할 수 있습니다.

  • 다이나믹 클로저-다이나믹 클로저를 만들 때, 클로저 함수는 생성 된 컨텍스트에 도달 할 수 있어야합니다. 소형 thunk은 (보통 스택에) 구축 될 수 있으며 일부 레지스터에서 컨텍스트 정보를 설정 한 다음 클로저의 기능을 구현하는 정적 코드로 이동합니다. 여기서 썽 크는 호출 사이트에서 제공하지 않는 함수에 하나 이상의 숨겨진 추가 인수를 효과적으로 제공합니다.


답변

썽 크라는 단어는 컴퓨터 과학에서 적어도 세 가지 관련 의미를 갖습니다. “썽크”는 다음과 같습니다.

  • 지연 계산을 수행하는 코드 조각 (클로저와 유사)
  • 일부 가상 함수 테이블 구현의 기능 (래퍼 함수와 유사)
  • 일반적으로 호환성을 위해 한 시스템 특정 형식에서 다른 시스템 형식으로의 머신 데이터 매핑

나는 보통 세 번째 문맥에서 사용되는 것을 보았다.

http://en.wikipedia.org/wiki/Thunk


답변

크라용어 는 원래 Algol60 컴파일러 에서 pass-by-name 의 Royal Radar Establishment 구현에서 사용 된 메커니즘을 나타냅니다 . 일반적으로 이것은 정적 개체를 참조 할 때 동적 동작을 유도하는 모든 방법을 나타냅니다. 이 용어는 Brian Wichmann에 의해 고안되었습니다. Brian Wichmann은 이름 별 설명을 요청했을 때 “메모리에서 값을로드 한 다음 갑자기 썽크 (thunk)-표현을 평가하고 있습니다.”라고 말했습니다.

썽 크는 하드웨어에 넣었습니다 (KDF9, Burroughs 메인 프레임 참조). 기계, 언어 및 컴파일러에 따라 소프트웨어로 구현하는 방법에는 여러 가지가 있습니다.

이 용어는 이름을 넘어서 일반화되었으며, 명백하거나 명목상 정적 인 데이터 참조가 동적 동작을 유발하는 상황을 포함합니다. 관련 용어에는 “트램폴린”및 “미래”가 포함됩니다.


답변

C ++와 같은 객체 지향 언어를위한 일부 컴파일러는 다중 상속 또는 가상 상속이있는 경우 가상 함수 호출을 최적화하여 “썽크”라는 함수를 생성합니다.

출처 : http://ko.wikipedia.org/wiki/Thunk#Thunks_in_object-oriented_programming


답변

사용에 상당한 변화가 있습니다. 일반적으로 썽 크는 (적어도 개념적으로는) 비정상적으로 작고 단순한 기능입니다. 일반적으로 어떤 것 또는 다른 것 (일부 데이터, 다른 기능 등)에 대한 올바른 인터페이스를 제공하는 어댑터의 일종이지만 최소한 다른 작업은 수행하지 않는 것으로 보입니다.

그것은 (적어도 일반적으로 사용되는) 구문 설탕은 사물이 인간이보고 싶어하는 방식으로 보이게하고, 썽 크는 컴파일러가 원하는 방식으로 무언가를 보이게한다는 점을 제외하고는 구문 설탕의 형태와 거의 같습니다. 그것을 참조하십시오.


답변

이 질문은 이미 SO에 대해 질문되었습니다.

구성표 또는 일반적으로 사용되는 ‘썽크’란 무엇입니까?

내가 알 수 있듯이, 람다 진술과 비슷합니다. 평가할 때까지 값을 반환하지 않을 수도 있습니다. 또는 값을 반환하기 위해 일부 코드를 실행하는 속성 게터와 비교할 수 있지만 변수와 더 유사한 인터페이스 형식을 갖지만 상속 또는 컴파일 타임 또는 환경 특성에 따라 런타임에 값을 평가하고 반환하는 함수 포인터를 교체합니다.


답변

나는 역사적으로 나에게 알려진 사실상의 사용과 일치하는이 용어에 대한 일반적인 ‘컴퓨터 과학’정의를 찾지 못해 고민했다. OS / 2 일과 16-32 비트 전환에서 실제로 호출 된 위치를 기억할 수있는 첫 번째 실제 발생입니다. “썽킹”은 오늘날의 적용에서 아이러니와 같습니다.

나의 대략적인 일반적인 이해는 썽 크는 언급 된 역사적인 경우에서와 같이 시스템들 사이에서 일종의 근본적인 경계를 가로 질러 아무 것도 수행하지 않는 스텁 루틴이라는 것이다.

따라서 감각은 한 환경에서 다른 환경으로 (유사 적으로 / 유사한) “풍부한”소리를내는 감각과 같습니다.