performance - فيجوال - لغة vb net




ما هو الجزء العلوي من نوع الخيار راست؟ (2)

في روست، لا يمكن أبدا أن تكون المراجع خالية، لذا في حالة الحاجة فعلا إلى قيمة فارغة، مثل قائمة مرتبطة، يمكنك استخدام نوع Option :

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

ما هو مقدار النفقات العامة في هذا من حيث تخصيص الذاكرة والخطوات إلى ديريفيرانس بالمقارنة مع مؤشر بسيط؟ هل هناك بعض "السحر" في مترجم / وقت التشغيل لجعل Option خالية من التكلفة، أو أقل تكلفة مما لو كان أحد لتنفيذ Option قبل نفسه في مكتبة غير الأساسية باستخدام نفس البناء enum ، أو عن طريق لف المؤشر في متجه ؟


نعم، هناك بعض السحر كومبيلر الذي يحسن 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 !


هذه الإجابة الآن عفا عليها الزمن؛ فإن التمييز في Option<T> هو الأمثل الآن حيثما أمكن. (بقية المعلومات المقدمة لا تزال مثيرة للاهتمام، على الرغم من.)

في الوقت الحالي، يحتل نوع Option نفس المساحة من أي نوع آخر من أنواع enum . أنا لا أعرف التفاصيل، ولكن من المؤكد أنها تمثل نوعا من التمييز التمييز.

ويجري النظر في إمكانية تعديل التمثيل الداخلي للتحسين من قبل المتطورين الصدأ.

هنا هو مناقشة ذات الصلة على القائمة البريدية ديف ، نشرها باتريك والتون:

أنا مترددة قليلا في الالتزام بتمثيل بت معين من إنومز، لأن هناك الكثير من الغرفة لتحسين المثيل هنا. على سبيل المثال، قد نرغب في تصغير Option<~int> إلى مؤشر نولابل، قد نرغب في تصغير Result<(),~str> إلى سلسلة Either<u8,~str> أو قد نرغب في التصغير Either<u8,~str> إلى 1، على افتراض أن السلاسل لا يمكن أن تشغل أبدا 256 بايت أعلى من مساحة العنوان. لقد فكرت لفترة من الوقت أنه ربما من الأفضل أن نقول فقط أن نمط بت من الصدأ إنومز غير محدد، لتعطينا أكبر قدر ممكن من الغرفة للعب مع التحسينات.





null-pointer