2012-05-19 18 views
5

मैं इसडी में एक स्ट्रक्चर सदस्य को संरेखित कैसे करें?

struct Foo(T) 
{ 
    align(8) void[T.sizeof] data; 
} 

लेकिन

static assert(Foo!(int).data.alignof == 8); 

की कोशिश की विफल रहता है, मुझे संरेखण अभी भी 8 के बजाय 1 है कह रही।

यह क्यों है, और मैं इसे कैसे ठीक कर सकता हूं, ताकि यह किसी भी मनमाने ढंग से संरेखण के लिए काम करे जो कि 2 की शक्ति है (केवल 8 नहीं)?

उत्तर

5

डीएमडी स्रोत ब्राउज़ करना, ऐसा लगता है कि alignofalign विशेषताएँ ध्यान में नहीं रखता है।

... if (ident == Id::__xalignof) 
{ 
    e = new IntegerExp(loc, alignsize(), Type::tsize_t); 
} 

यह मान alignsize() के साथ एक size_t अभिव्यक्ति में एक .alignof अभिव्यक्ति बदल देता है, तो चलो एक स्थिर सरणी के लिए alignsize() को देखो:

unsigned TypeSArray::alignsize() 
{ 
    return next->alignsize(); 
} 

यह सिर्फ

यहाँ जहां यह नियंत्रित किया जाता है है आपके मामले में तत्व प्रकार (void) का संरेखण प्राप्त करता है।

voidTypeBasic::alignsize(), जो सिर्फ TypeBasic::size(0)

switch (ty) 
{ 
    ... 
    case Tvoid: 
     size = 1; 
     break; 
    ... 
} 

को आगे कैसे अन्य प्रकार संभाल alignof को देखते हुए द्वारा नियंत्रित किया जाता है, यह नहीं दिखता है जैसे align विशेषताओं को ध्यान में सब पर लिया जाता है, लेकिन मैं गलत हो सकता है । यह संरेखण मैन्युअल रूप से परीक्षण करने लायक हो सकता है।

+0

लॉल प्रतीक्षा करें तो 'संरेखण' क्या करता है? क्या यह सिर्फ सजावट के लिए है? xD – Mehrdad

+0

मुझे लगता है कि 'align' काम करता है, लेकिन' alignof' बस प्रकार के संरेखण को प्राप्त करता है, इसलिए वे अलग-अलग चीजें हैं। –

+0

अजीब, मैं उन समस्याओं में भाग रहा था जो मुझे 'alignof' की जांच करने के लिए प्रेरित किया ... हालांकि डबल-चेक होना चाहिए .. – Mehrdad

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