अगर मैं एक निश्चित संरेखण आवश्यकता के साथ एक सरल प्रकार को परिभाषित करते हुए कहा प्रकार का एक std::vector<t>
हर एक तत्व के लिए संरेखण नहीं सम्मान करना चाहिए?std :: वेक्टर सम्मान alignof (value_type) चाहिए?
, निम्न उदाहरण
typedef std::array<double,3> alignas(32) avx_point;
std::vector<avx_point> x(10);
assert(!(std::ptrdiff_t(&(x[0]))&31) && // assert that x[0] is 32-byte aligned
!(std::ptrdiff_t(&(x[1]))&31)); // assert that x[1] is 32-byte aligned
मैंने पाया कि संरेखण आवश्यकता (बिना किसी चेतावनी) 3.2 बजना (के साथ या -stdlib=libc++
के बिना) का उल्लंघन चुपचाप है पर विचार करें, जबकि जीसीसी 4.8.0 मुद्दों एक चेतावनी है कि यह ध्यान नहीं देता std::vector
करने के लिए टेम्पलेट तर्क पर गुण (इंटेल संकलक भी alignas
को समझने के लिए Daft है, लेकिन अगर मैं __declspec(align(32))
बजाय का उपयोग करें, यह बजना तरह बर्ताव करता है)। दोनों कोड बनाते हैं जो जोर देते हैं।
तो, यह सही व्यवहार या बजना (और icpc) की एक बग और जीसीसी के साथ कोई समस्या है?
संपादित एक प्रश्न टिप्पणी में उठाया जवाब देने के लिए: अगर मैं
typedef typename std::aligned_storage<sizeof (avx_point),
alignof(avx_point)>::type avx_storage;
परिभाषित मैं
sizeof (avx_storage) == 32;
alignof(avx_storage) == 32;
लेकिन std::vector<avx_storage>
अभी भी पहला तत्व संरेखित करने के लिए विफल रहता है मिल (और इसलिए सभी अन्य भी) clang और gcc के लिए (इस बार चेतावनी के बिना)। तो वहाँ जाहिरा तौर पर कार्यान्वयन के साथ दो मुद्दे हैं: पहला, कि std::allocator<type>
भी पहले तत्व के लिए किसी भी संरेखण आवश्यकताओं पर ध्यान नहीं देता (अवैध?) और दूसरा, कि कोई गद्दी बाद तत्वों के संरेखण सुनिश्चित करने के लिए लागू किया जाता है।
ब्याज से, यदि आप 'std :: vector>' की तुलना करते हैं तो क्या होता है? –
Useless