HeadlinesBriefing favicon HeadlinesBriefing.com

Rust के Vtables का दृश्यीकरण: dyn Trait स्मृति में कैसे काम करता है

Hacker News •
×

मैं रस्ट में गोता लगा रहा हूं और यह दोनों ही संतोषजनक और दिमाग हिलाने वाला है। अब तक मैं किताब और Mara Bos की किताब से सीख रहा हूं, लेकिन मुझे खुद की जांच करने की इच्छा हुई। इन प्रयोगों का मेरा प्रारंभिक लक्ष्य रस्ट के बहुरूपदर्शक दृष्टिकोण की तुलना C++ से करना था। हालांकि, अंततः, जैसा कि मुझे एहसास हुआ, एक नई भाषा को समझने के लिए दूसरी भाषा के माध्यम से 1:1 समांतर खींचने की कोशिश करना एक जाल है। यह लग सकता है कि मदद करता है, लेकिन अंत में, हम रस्ट को C++ के रूप में नहीं व्यवहार कर सकते हैं। यदि ऐसा होता, तो इसमें कुछ क्रांतिकारी नहीं होता। फिर भी, मुझे लगता है कि इसमें गहराई से जानने का मूल्य है और यह समझने के लिए कि क्यों। इसलिए, अगर आप मुझे जैसे हैं और जानना चाहते हैं कि स्मृति में exactamente क्या हो रहा है, ताकि आपको लगे कि आप वास्तव में अवधारणाओं को समझते हैं, तो मुझे आशा है कि यह पोस्ट उपयोगी लगेगी :)बात यह है, थंबनेल छवि एक कवक की फोटो है, जिसे हम रस्ट के नाम के लिए जिम्मेदार ठहराते हैं। Credit: gailhampshire from Cradley, Malvern, U.K, CC BY 2.0, via Wikimedia Commons. आप सभी कोड और प्रयोगों को Git Hub पर पा सकते हैं।

परिचय: मामले का सार

हम जो करने की कोशिश कर रहे हैं वह काफी सरल है। मान लीजिए हमारे पास आकृतियों का एक गुच्छा है: वृत्त, वर्ग, त्रिभुज, और हमें प्रत्येक एक पर draw() कॉल करना है।

C++ तरीका #1: आभासी कार्य सबसे पहले दिमाग में आने वाला C++ का तरीका आभासी कार्य है, जो समय के दौरान बहुरूपदर्शक का उपयोग करता है। vtable pointer वस्तु के अंदर रहता है, आभासी डिस्पैच स्वचालित रूप से होता है।

std::vector<Shape*> shapes = { new Circle(), new Square() };

for (auto* s : shapes)s->draw();

Rust का equivalente dyn Trait है, जो अंततः हम समझना चाहते हैं। लेकिन सबसे पहले, आइए C++ में इस समस्या को हल करने का एक और तरीका देखें।

C++ तरीका #2: CRTP कोई भी CRTP (सिज़लिंग रूप से दोहराया जाने वाला Template पैटर्न) मार्ग भी ले सकता है, जो Essentially समय के दौरान बहुरूपदर्शक है। यदि आप रुचि रखते हैं, तो Klaus Iglberger की यह शानदार बातचीत मेरा इस विषय में पहला परिचय था, और मुझे संदर्भ के लिए इसे दोबारा देखना पसंद है।

template<typename Derived>struct Shape {void draw() {static_cast<Derived*>(this)->draw();}}; Essentially, कोई vtable नहीं है और यह समय के दौरान बहुरूपदर्शक है, पठनीयता से समझौता करता है (यह सचमुच एक मुंहful है)।

Rust एक बहुत ही सीधा और सरल CRTP के बराबर प्रदान करता है, namely एकलकरण। यह वह दृष्टिकोण है जिसे हम पहले खुदाई करेंगे ताकि शुरू कर सकें कि हमारे पास क्या है रस्ट की पेशकश करने के लिए मानसिक मॉडल।

स्थैतिक डिस्पैच Photo by Jiawei Zhao on Unsplash स्थैतिक डिस्पैच, जिसे जनरिक के रूप में भी जाना जाता है, CRTP के समान परिणाम प्राप्त करता है: कंपाइलर प्रत्येक प्रकार के लिए फ़ंक्शन की एक अलग प्रति उत्पन्न करता है जिसे इसके साथ कॉल किया गया है। कोई रनटाइम लागत नहीं है, लेकिन प्रकार को कंपाइल समय पर जाना जाना चाहिए।

trait Draw {fn draw(&self) -> &str;}struct Circle;struct Square;impl Draw for Circle {fn draw(&self) -> &str {