रस्ट के विकल्प प्रकार का ओवरहेड क्या है?


85

जंग में, संदर्भ कभी भी अशक्त नहीं हो सकते हैं, इसलिए ऐसे मामले में जहां आपको वास्तव में अशक्त होने की जरूरत है, जैसे कि एक लिंक की गई सूची, आप Optionप्रकार का उपयोग करते हैं :

struct Element {
    value: i32,
    next: Option<Box<Element>>,
}

एक साधारण पॉइंटर की तुलना में मेमोरी के आवंटन और डीरेफेरेंस के कदम के मामले में यह कितना ओवरहेड शामिल है? क्या संकलक / रनटाइम में कुछ "जादू" है, Optionलागत-मुक्त बनाने के लिए , या उससे भी कम महंगा है अगर कोई Optionएक ही enumनिर्माण का उपयोग करके गैर-कोर लाइब्रेरी में खुद को लागू करने के लिए , या एक वेक्टर में पॉइंटर लपेटकर?

जवाबों:


88

हां, कुछ संकलक जादू है जो Option<ptr>एकल सूचक (अधिकांश समय) के लिए अनुकूलित है।

use std::mem::size_of;

macro_rules! show_size {
    (header) => (
        println!("{:<22} {:>4}    {}", "Type", "T", "Option<T>");
    );
    ($t:ty) => (
        println!("{:<22} {:4} {:4}", stringify!($t), size_of::<$t>(), size_of::<Option<$t>>())
    )
}

fn main() {
    show_size!(header);
    show_size!(i32);
    show_size!(&i32);
    show_size!(Box<i32>);
    show_size!(&[i32]);
    show_size!(Vec<i32>);
    show_size!(Result<(), Box<i32>>);
}

निम्नलिखित आकार मुद्रित होते हैं (64-बिट मशीन पर, इसलिए पॉइंटर्स 8 बाइट्स हैं):

// As of Rust 1.22.1
Type                      T    Option<T>
i32                       4    8
&i32                      8    8
Box<i32>                  8    8
&[i32]                   16   16
Vec<i32>                 24   24
Result<(), Box<i32>>      8   16

ध्यान दें कि &i32, Box, &[i32], Vec<i32>सभी उपयोग एक अंदर गैर-व्यर्थ सूचक अनुकूलन Option!


38
इसके अलावा, यह अनुकूलन सभी "समान" Optionएनम में होता है , इसलिए यह उपयोगकर्ता द्वारा परिभाषित के लिए भी काम करेगा Option
पॉल स्टैंसिफर

4
यह भी ध्यान दें कि इस अनुकूलन को स्टैक नहीं किया जा सकता है। इसे उदाहरण में अंतिम पंक्ति में देखा जा सकता है। जैसा कि आप ओके के प्रकार को निर्दिष्ट करते हैं (), वह विशिष्ट परिणाम प्रकार "एनम जैसा विकल्प" बन जाता है और इसलिए विकल्प स्तर पर इसे अनुकूलित नहीं किया जा सकता है। लेकिन अगर आप अपने साथ प्रयास करते हैं Result<i32, i32>तो देख सकते हैं कि अनुकूलन फिर से लागू हो गया है।
पजन

5
@Pajn यह दिखता है, कम से कम मार्च 2020 तक, इस प्रकार के अनुकूलन को तब तक स्टैक किया जा सकता है जब तक कि पर्याप्त अन्यथा अमान्य बाइनरी अभ्यावेदन न हों। बेशक, गैर-अशक्त संकेत आमतौर पर केवल एक अमान्य द्विआधारी प्रतिनिधित्व करते हैं।
वालुस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.