মরিচা অপশন ধরণের ওভারহেড কি?


88

মরিচে, রেফারেন্সগুলি কখনই নਾਲ হতে পারে না, সুতরাং যেখানে আপনার আসলে নাল প্রয়োজন যেমন একটি লিঙ্কযুক্ত তালিকার ক্ষেত্রে আপনি Optionটাইপটি ব্যবহার করেন :

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

একটি সাধারণ পয়েন্টারের তুলনায় মেমরি বরাদ্দ এবং অবনতির পদক্ষেপের ক্ষেত্রে ওভারহেড কতটা এতে জড়িত? সংযোজন / রানটাইম Option-এ কোনও "যাদু" কি ব্যয়-মুক্ত করার জন্য তৈরি করা হয়েছে , বা Optionএকই enumকন্সট্রাক্টটি ব্যবহার করে নন-কোর লাইব্রেরিতে নিজেই প্রয়োগ করা হয়েছে বা ভেক্টরে পয়েন্টারটি মোড়ক করে দেওয়ার চেয়ে কম ব্যয়বহুল ?

উত্তর:


91

হ্যাঁ, এমন কয়েকটি সংকলক যাদু রয়েছে যা 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>সব ব্যবহারের একটি ভিতরে অ nullable পয়েন্টার অপ্টিমাইজেশান Option!


39
তদ্ব্যতীত, এই অপটিমাইজেশনটি সমস্ত " Option-র মত" এনামগুলিতে ঘটে থাকে , সুতরাং এটি কোনও ব্যবহারকারী-সংজ্ঞায়িত হয়ে কাজ করবে Option
পল স্টানসিফার

4
এছাড়াও নোট করুন যে এই অপ্টিমাইজেশনটি স্ট্যাক করা যাবে না। এটি উদাহরণের শেষ লাইনে দেখা যাবে। আপনি যেমন ওকে () হিসাবে প্রকারটি নির্দিষ্ট করেন, সেই নির্দিষ্ট ফলাফলের ধরণটি "এনামের মতো বিকল্প" হয়ে যায় এবং অতএব বিকল্প স্তরে অনুকূলিত করা যায় না। তবে আপনি যদি চেষ্টা করে Result<i32, i32>দেখতে পারেন যে অপটিমাইজেশনটি আবার প্রয়োগ হয়েছে।
পাজান

4
@ পাজান দেখে মনে হচ্ছে, কমপক্ষে ২০২০ সালের মার্চ পর্যন্ত এই ধরণের অপ্টিমাইজেশানটি যতক্ষণ না পর্যাপ্ত অন্যথায় অবৈধ বাইনারি উপস্থাপনা রয়েছে ততক্ষণ স্ট্যাক করা যেতে পারে । অবশ্যই, নন-নুল পয়েন্টারগুলিতে সাধারণত একটি অবৈধ বাইনারি উপস্থাপনা থাকে।
ভেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.