Tôi đã thấy nó được sử dụng trong lập trình (cụ thể là trong miền C ++) và không biết nó là gì. Có lẽ đó là một mẫu thiết kế, nhưng tôi có thể sai. Bất cứ ai có thể đưa ra một ví dụ tốt về một thunk?
Tôi đã thấy nó được sử dụng trong lập trình (cụ thể là trong miền C ++) và không biết nó là gì. Có lẽ đó là một mẫu thiết kế, nhưng tôi có thể sai. Bất cứ ai có thể đưa ra một ví dụ tốt về một thunk?
Câu trả lời:
A thunk
thường đề cập đến một đoạn mã nhỏ được gọi là hàm, thực hiện một số điều nhỏ và sau đó JUMP
s đến một vị trí khác (thường là hàm) thay vì quay lại trình gọi của nó. Giả sử mục tiêu JUMP là một chức năng bình thường, khi nó trở lại, nó sẽ trở về người gọi của thunk.
Thunks có thể được sử dụng để thực hiện rất nhiều điều hữu ích một cách hiệu quả
dịch giao thức - khi gọi từ mã sử dụng một quy ước gọi sang mã sử dụng quy ước gọi khác, thunk
có thể được sử dụng để dịch các đối số một cách thích hợp. Điều này chỉ hoạt động nếu các quy ước hoàn trả là tương thích, nhưng đó thường là trường hợp
xử lý hàm ảo - khi gọi một hàm ảo của lớp cơ sở được thừa kế nhiều lần trong C ++, cần phải có một bản sửa lỗi của this
con trỏ để đưa nó đến đúng vị trí. A thunk
có thể làm điều này.
đóng cửa động - khi bạn xây dựng một đóng cửa động, chức năng đóng cần có thể có được ở bối cảnh nơi nó được tạo. Một cái nhỏ thunk
có thể được xây dựng (thường là trên ngăn xếp) để thiết lập thông tin ngữ cảnh trong một số thanh ghi và sau đó nhảy đến một đoạn mã tĩnh thực hiện chức năng của bao đóng. Thunk ở đây đang cung cấp một cách hiệu quả một hoặc nhiều đối số phụ ẩn cho hàm không được cung cấp bởi trang web cuộc gọi.
this
), đóng cửa hàm xây dựng mặc định / sao chép (để tích hợp CRT tốt hơn với các tham số do người dùng cung cấp với các tham số mặc định, chủ yếu để xuất DLL hoặc xây dựng mảng), vcall
thunks (để đảm bảo con trỏ -member-function hoạt động đúng với các chức năng ảo), vtordisp
thunks (đối với các lớp kế thừa và ghi đè các chức năng ảo từ các cơ sở ảo, và cũng có các trình điều khiển và / hoặc trình điều khiển do người dùng cung cấp), trình bao bọc riêng (để gọi C ++ / CLI
UDT returning
" (dường như là một phần mềm để điều chỉnh các loại do người dùng xác định được trả về bởi các toán tử, nhưng tôi không chắc chắn cách tạo ra nó; tôi nghĩ rằng nó không được dùng nữa). Có lẽ có những người khác, quá. Tôi đoán bạn không bao giờ có thể nói Microsoft thunk
không; Descartes sẽ tự hào.
Từ thunk có ít nhất ba ý nghĩa liên quan trong khoa học máy tính. Một "thunk" có thể là:
Tôi thường thấy nó được sử dụng trong bối cảnh thứ ba.
Thuật ngữ thunk ban đầu dùng để chỉ cơ chế được sử dụng bởi triển khai Cơ sở Radar Hoàng gia trong tên của trình biên dịch Algol60 . Nói chung, nó đề cập đến bất kỳ cách nào để gây ra hành vi động khi tham chiếu một đối tượng tĩnh rõ ràng. Thuật ngữ này được phát minh bởi Brian Defendingmann, người khi được yêu cầu giải thích tên đã nói "Vâng, bạn đi ra ngoài để tải giá trị từ bộ nhớ và sau đó đột nhiên - thunk - có bạn đang đánh giá một biểu thức."
Thunk đã được đưa vào phần cứng (xem KDF9, máy tính lớn của Burroughs). Có một số cách để thực hiện chúng trong phần mềm, tất cả đều rất cụ thể về máy móc, ngôn ngữ và trình biên dịch.
Thuật ngữ này đã được khái quát hóa vượt ra ngoài tên, để bao gồm mọi tình huống trong đó một tham chiếu dữ liệu tĩnh rõ ràng hoặc danh nghĩa gây ra hành vi động. Các thuật ngữ liên quan bao gồm "tấm bạt lò xo" và "tương lai".
Một số trình biên dịch cho các ngôn ngữ hướng đối tượng, chẳng hạn như C ++ tạo ra các hàm được gọi là "thunks" dưới dạng tối ưu hóa các cuộc gọi hàm ảo với sự hiện diện của nhiều kế thừa hoặc ảo.
Lấy từ: http://en.wikipedia.org/wiki/Thunk#Thunks_in_object-oriented_programming
Có sự thay đổi đáng kể trong sử dụng. Hầu như trên toàn cầu, thunk là một chức năng (ít nhất là về mặt khái niệm) nhỏ và đơn giản khác thường. Đó thường là một số loại bộ chuyển đổi cung cấp cho bạn giao diện chính xác với thứ gì đó hoặc thứ khác (một số dữ liệu, chức năng khác, v.v.) nhưng ít nhất được xem là làm ít hơn.
Nó gần giống như một dạng đường cú pháp, ngoại trừ rằng (ít nhất là thường được sử dụng) đường cú pháp được cho là làm cho mọi thứ trông giống như cách người đọc muốn nhìn thấy chúng, và một thunk là làm cho cái gì đó trông giống như trình biên dịch muốn nhìn thấy nó.
Câu hỏi này đã được hỏi trên SO, xem:
'Thunk' là gì, như được sử dụng trong Đề án hoặc nói chung?
Từ những gì tôi có thể nói, nó giống với một tuyên bố lambda, nơi bạn có thể không muốn trả về giá trị cho đến khi bạn cần đánh giá nó; hoặc nó cũng có thể được so sánh với một getter thuộc tính mà theo thiết kế thực thi một số mã để trả về một giá trị trong khi vẫn có dạng giao diện giống như một biến, nhưng cũng có hành vi đa hình có thể được hoán đổi cho dù là do thừa kế hay bằng cách hoán đổi con trỏ hàm sẽ đánh giá và trả về một giá trị trong thời gian chạy dựa trên các đặc tính môi trường hoặc thời gian biên dịch.
Tôi đã đau khổ khi không tìm thấy định nghĩa chung về 'khoa học máy tính' về thuật ngữ này phù hợp với cách sử dụng thực tế của nó như tôi đã biết trong lịch sử. Cuộc gặp gỡ thực tế đầu tiên tôi có thể nhớ lại nơi nó thực sự được gọi là trong HĐH / 2 ngày và quá trình chuyển đổi 16-32 bit. Nó xuất hiện "thunking" giống như trớ trêu trong ứng dụng của nó ngày nay.
Hiểu biết chung của tôi là thunk là một thói quen sơ khai mà không làm gì hoặc tuyến đường qua một số ranh giới cơ bản bằng hiện vật giữa các hệ thống như trong các trường hợp lịch sử đã đề cập.
Vì vậy, cảm giác giống như một sự đồng điệu của việc bị rơi từ môi trường này sang môi trường khác tạo ra (ẩn dụ / như một sự mô phỏng) một âm thanh "thunk".
Tôi sẽ tìm kiếm điều này, nhưng tôi nghĩ rằng việc xử lý dữ liệu là quá trình được sử dụng bởi bộ xử lý 32 bit để chạy mã 16 bit cũ.
Tôi đã từng sử dụng nó như một sự tương tự về cách bạn phải hạn chế tốc độ bạn nói và những từ bạn sử dụng khi nói chuyện với người câm.
Vâng, đó là trong liên kết Wikipedia (phần khoảng 32 bit, không phải là mọt sách của tôi ).
https://en.wikipedia.org/wiki/Thunk
Phần lớn tài liệu về các khả năng tương tác liên quan đến các nền tảng Wintel khác nhau, bao gồm MS-DOS, OS / 2, [8] Windows [9] [10] và .NET, và chuyển đổi từ địa chỉ bộ nhớ 16 bit sang 32 bit . Khi khách hàng đã di chuyển từ nền tảng này sang nền tảng khác, thunks rất cần thiết để hỗ trợ phần mềm cũ được viết cho các nền tảng cũ hơn.
(nhấn mạnh thêm bởi tôi)
Việc sử dụng "thunk" sớm nhất mà tôi biết là từ cuối thập niên 50 liên quan đến đánh giá đối số qua tên của Algol60 trong các lệnh gọi hàm. Algol ban đầu là một ngôn ngữ đặc tả, không phải là ngôn ngữ lập trình và có một số câu hỏi về cách thực hiện mật khẩu trên máy tính.
Giải pháp là vượt qua điểm vào của những gì thực chất là lambda. Khi callee đánh giá tham số, kiểm soát rơi qua - thunk! - vào ngữ cảnh của người gọi nơi lambda được đánh giá và kết quả đã trở thành giá trị của tham số trong callee.
Trong phần cứng được gắn thẻ, chẳng hạn như các máy Burroughs, việc đánh giá được ngầm định: một đối số có thể được truyền dưới dạng giá trị dữ liệu như trong giá trị truyền qua thông thường hoặc theo thunk cho tên qua, với các thẻ khác nhau trong siêu dữ liệu đối số . Một phần cứng hoạt động tải đã kiểm tra thẻ và trả về giá trị đơn giản hoặc tự động gọi thunk lambda.
Theo định nghĩa của Kyle Simpson , một thunk là một cách để trừu tượng hóa thành phần thời gian ra khỏi mã không đồng bộ.