टुकड़ा पर विचार करेंक्या किसी ऑब्जेक्ट को किसी दिन किसी स्थानांतरित करने के दौरान जंग-बिट प्रतिलिपि को अनुकूलित कर सकते हैं?
struct Foo {
dummy: [u8; 65536],
}
fn bar(foo: Foo) {
println!("{:p}", &foo)
}
fn main() {
let o = Foo { dummy: [42u8; 65536] };
println!("{:p}", &o);
bar(o);
}
कार्यक्रम का एक विशिष्ट result
0x7fffc1239890
0x7fffc1229890
जहां पते अलग-अलग हैं।
स्पष्ट रूप से, बड़े सरणी dummy
की प्रतिलिपि बनाई गई है, जैसा कि संकलक के चाल कार्यान्वयन में अपेक्षित है। दुर्भाग्यवश, इसमें गैर-मामूली प्रदर्शन प्रभाव हो सकता है, क्योंकि dummy
एक बहुत बड़ी सरणी है। यह प्रभाव लोगों को इसके बजाय संदर्भ द्वारा गुजरने का तर्क चुनने के लिए मजबूर कर सकता है, भले ही कार्य वास्तव में तर्क को "उपभोग" करता है।
Foo
Copy
प्राप्त नहीं करता है, ऑब्जेक्ट o
स्थानांतरित हो गया है। चूंकि जंग ने ऑब्जेक्ट की पहुंच को मना कर दिया है, इसलिए bar
को मूल ऑब्जेक्ट o
"पुन: उपयोग करने" के लिए क्या रोक रहा है, जिससे संकलक संभावित रूप से महंगे बिट-वार प्रतिलिपि उत्पन्न कर सकता है? क्या कोई मौलिक कठिनाई है, या क्या हम इस बिट-वार प्रतिलिपि को अनुकूलित करने के लिए किसी दिन संकलक को देखेंगे?
रुस्टक चाल को अनुकूलित करता है। ऐसा इस मामले में ऐसा नहीं कर रहा है, शायद इसलिए कि llvm ने इनलाइन बार नहीं किया था। यह भी हो सकता है क्योंकि आप सूचक मानों का पालन करने की कोशिश कर रहे हैं, और llvm यह सुनिश्चित नहीं है कि यह अनुकूलित करने के लिए सुरक्षित है या नहीं। मैंने इसे ': पी' प्रिंट के बिना कोशिश की और इसके बजाय परीक्षण :: black_box का उपयोग किया, और कॉपी असेंबली से गायब हो गई। – Manishearth
@ मनीशेर्थ 'बार' रेखांकित हो रहा है। एलएलवीएम बड़े सरणी की चाल को हटाने में बस खराब है। – Veedrac