2015-09-06 10 views
5

मुझे जंग में 16 बाइट सीमा के लिए एक संरचना को संरेखित करने की आवश्यकता है। repr attribute को संरेखण के बारे में संकेत देना संभव लगता है, लेकिन यह इस सटीक उपयोग के मामले का समर्थन नहीं करता है।मैं निर्दिष्ट बाइट सीमा पर एक संरचना को कैसे संरेखित कर सकता हूं?

मैं क्या हासिल करने की कोशिश कर रहा हूँ का एक कार्यात्मक परीक्षण एक प्रकार Foo ऐसी है कि

assert_eq!(mem::align_of::<Foo>(), 16); 

या वैकल्पिक रूप से, एक क्षेत्र के साथ एक struct Barbaz ऐसी है कि

println!("{:p}", Bar::new().baz); 

हमेशा एक प्रिंट है 16 से विभाजित संख्या

क्या यह वर्तमान में जंग में संभव है? क्या कोई काम-आसपास है?

+1

क्या आपका मतलब है कि आप एक विशिष्ट संरेखण के साथ ढेर में एक संरचना चाहते हैं? मुझे स्टैक-आवंटित प्रकारों के लिए संरेखण के बारे में पता नहीं है, लेकिन अस्थिर ['आवंटित '] (http://doc.rust-lang.org/std/rt/heap/fn.allocate.html) में संरेखण है तर्क। – Shepmaster

+1

इसके अलावा, आप पैकिंग का उल्लेख संरेखण घटाने के रूप में करते हैं; क्या आप कहने का मतलब है कि आपको हमेशा एक विशिष्ट संरेखण पर एक संरचना का * सदस्य * होना चाहिए? आप अपने प्रश्न को कुछ उदाहरण कोड, एएससीआईआईआई-आर्ट मेमोरी आरेखों, या अधिक गद्य का वर्णन कर सकते हैं कि आपको ऐसा करने की आवश्यकता क्यों है ताकि मैं जितना अधिक बुद्धिमान व्यक्ति आपकी मदद कर सकूं।^_^ – Shepmaster

+0

प्रतिक्रिया के लिए धन्यवाद, @ शेमपस्टर! मेरा मतलब सामान्य रूप से गठबंधन था, लेकिन हाँ, मेरा विशिष्ट उपयोग केस ढेर के लिए है। मैं अपने प्रश्न को स्पष्ट होने के लिए अपडेट करूंगा। –

उत्तर

10

इस समय सीधे संरेखण निर्दिष्ट करने का कोई तरीका नहीं है, लेकिन यह निश्चित रूप से वांछनीय और उपयोगी है। यह issue #33626 द्वारा कवर किया गया है, और इसकी RFC issue है।

एक मौजूदा काम के आसपास के रूप में कुछ प्रकार T के संरेखण जो आकार शून्य है प्रकार [T; 0] के एक क्षेत्र को शामिल करने के है और इसलिए अन्यथा के व्यवहार को प्रभावित नहीं करेगा के रूप में बड़े होने के लिए कुछ struct Foo के संरेखण के लिए मजबूर करने संरचना, उदाहरण के लिए struct Foo { data: A, more_data: B, _align: [T; 0] }

रात को, इसे एक विशिष्ट उच्च संरेखण प्राप्त करने के लिए सिम प्रकार के साथ जोड़ा जा सकता है, क्योंकि उनके पास उनके आकार के बराबर संरेखण होता है (ठीक है, दो की अगली शक्ति), उदा।

#[repr(simd)] 
struct SixteenBytes(u64, u64); 

struct Foo { 
    data: A, 
    more_data: B, 
    _align: [SixteenBytes; 0] 
} 
+0

फ़ील्ड को केवल तभी संरेखित किया जा सकता है यदि संरचना की शुरुआत एक ज्ञात संरेखण है, क्योंकि यह हमेशा शुरुआत से निश्चित ऑफ़सेट होता है। इस प्रकार, यह चाल वास्तव में कोई फर्क नहीं पड़ता कि क्षेत्र संरचना संरचना में कहां है। – huon

+0

मुझे यह नहीं पता था - धन्यवाद। तो '(& struct + ऑफसेट)% वांछित_alignment == 0' की आवश्यकता के बजाय, कंपाइलर' और struct% इच्छित_alignment == 0 और ऑफसेट% इच्छित_alignment == 0 सुनिश्चित करता है? यह बहुत अपमानजनक लगता है, लेकिन मुझे यकीन है कि एक कारण होना चाहिए - क्या आप मुझे और जानने के लिए इस पर किसी भी संसाधन के लिए इंगित कर सकते हैं? – U007D

संबंधित मुद्दे

 संबंधित मुद्दे