프로그래밍에서 (특히 C ++ 도메인에서) 사용되는 것을 보았고 그것이 무엇인지 전혀 모릅니다. 아마도 그것은 디자인 패턴이지만 틀릴 수 있습니다. 누구든지 썽크의 좋은 예를 줄 수 있습니까?
프로그래밍에서 (특히 C ++ 도메인에서) 사용되는 것을 보았고 그것이 무엇인지 전혀 모릅니다. 아마도 그것은 디자인 패턴이지만 틀릴 수 있습니다. 누구든지 썽크의 좋은 예를 줄 수 있습니까?
답변:
A는 thunk
일반적으로 함수라고하는 작은 코드를 말하며 작은 일을 한 다음 JUMP
호출자에게 반환하는 대신 다른 위치 (보통 함수)로갑니다. JUMP 대상이 정상적인 함수라고 가정하면 반환되면 썽크의 호출자에게 반환됩니다.
썽 크는 많은 유용한 것들을 효율적으로 구현하는 데 사용될 수 있습니다
프로토콜 변환-하나의 호출 규칙을 사용하는 코드에서 다른 호출 규칙을 사용하는 코드로 호출 thunk
할 때 인수를 적절하게 변환하는 데 사용할 수 있습니다. 이것은 반환 규칙이 호환되는 경우에만 작동하지만 종종 그러한 경우가 있습니다
가상 함수 처리-C ++에서 다중 상속 된 기본 클래스의 가상 함수를 호출 할 때 this
올바른 위치를 가리 키도록 포인터를 수정해야합니다 . A는 thunk
이 작업을 수행 할 수 있습니다.
다이나믹 클로저-다이나믹 클로저를 만들 때, 클로저 함수는 생성 된 컨텍스트에 도달 할 수 있어야합니다. 소형 thunk
은 (보통 스택에) 구축 될 수 있으며 일부 레지스터에서 컨텍스트 정보를 설정 한 다음 클로저의 기능을 구현하는 정적 코드로 이동합니다. 여기서 썽 크는 호출 사이트에서 제공하지 않는 함수에 하나 이상의 숨겨진 추가 인수를 효과적으로 제공합니다.
this
), 기본 / 복사 생성자 클로저 (기본 제공 매개 변수, 주로 DLL 내보내기 또는 배열 구성에 대한 사용자 제공 항목의 CRT 통합 향상 vcall
을 위해 ), 썽크 (포인터를 확실히하기 위해) 멤버 함수는 가상 함수와 올바르게 작동), vtordisp
썽크 (가상베이스에서 가상 함수를 상속 및 재정의하고 사용자 제공 ctor 및 / 또는 dtor가있는 클래스), 네이티브 래퍼 (관리되는 C ++ / CLI 호출
UDT returning
"(연산자에 의해 반환되는 사용자 정의 형식을 조정하기위한 썽크 인 것처럼 보이지만 생성 방법을 잘 모르겠습니다. 더 이상 사용되지 않는 것 같습니다). 아마도 다른 것들도있을 것입니다. 나는 당신이 마이크로 소프트를 절대 말할 수 없다고 생각합니다 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 비트 전환에서 실제로 호출 된 위치를 기억할 수있는 첫 번째 실제 발생입니다. "썽킹"은 오늘날의 적용에서 아이러니와 같습니다.
나의 대략적인 일반적인 이해는 썽 크는 언급 된 역사적인 경우에서와 같이 시스템들 사이에서 일종의 근본적인 경계를 가로 질러 아무 것도 수행하지 않는 스텁 루틴이라는 것이다.
따라서 감각은 한 환경에서 다른 환경으로 (유사 적으로 / 유사한) "풍부한"소리를내는 감각과 같습니다.
나는 이것을 찾아 볼 것이지만, 썽킹 생각 은 레거시 16 비트 코드를 실행하기 위해 32 비트 프로세서에서 사용하는 프로세스 .
나는 어리석은 사람들과 대화 할 때 말하는 속도와 단어를 제한하는 방법에 대한 비유로 사용했습니다.
예, Wikipedia 링크에 있습니다 (내 신경 과가 아닌 32 비트 부분) ).
https://ko.wikipedia.org/wiki/Thunk
상호 운용성 썽크에 대한 많은 문헌은 MS-DOS, OS / 2, [8] Windows [9] [10] 및 .NET을 포함한 다양한 Wintel 플랫폼 및 16 비트에서 32 비트 메모리 주소로의 전환과 관련이 있습니다. . 고객이 한 플랫폼에서 다른 플랫폼으로 마이그레이션함에 따라 이전 플랫폼 용으로 작성된 레거시 소프트웨어를 지원하기 위해 썽크가 필수적이었습니다.
(나에 의해 추가 된 강조)
내가 아는 "thunk"의 초기 사용은 함수 호출에서 Algol60 이름 별 인수 평가와 관련하여 50 년대 후반부터입니다. Algol은 원래 프로그래밍 언어가 아닌 사양 언어였으며 컴퓨터에서 이름으로 통과를 구현하는 방법에 대한 몇 가지 질문이있었습니다.
해결책은 본질적으로 람다의 진입 점을 통과하는 것이 었습니다. 수신자가 매개 변수를 평가하면 제어가 실패했습니다. -람다가 평가 된 발신자의 상황에 따라 결과는 수신자의 매개 변수 값이되었습니다.
Burroughs 시스템과 같은 태그가 지정된 하드웨어에서 평가는 암시 적입니다. 인수는 일반 값별 데이터와 같이 데이터 값으로 전달되거나 이름 별 패스 용 매개 변수로 인수 메타 데이터에 다른 태그가 전달 될 수 있습니다. . 로드 작업 하드웨어가 태그를 확인하고 간단한 값을 반환하거나 람다 썽크를 자동으로 호출했습니다.
당 카일 심슨의 정의하는 썽크는 추상적 인 구성 요소에 대한 방법입니다 시간 비동기 코드 중.