मुझे यकीन है कि जीसीसी 4.5.2 पुराना है कि यह मानक संस्करण का समर्थन नहीं करता है, लेकिन सी ++ 11 विशेष रूप से संरेखण - std::aligned_storage
और std::aligned_union
अन्य चीज़ों के साथ सौदा करने के लिए कुछ प्रकार जोड़ता है (देखें अधिक जानकारी के लिए §20.9.7.6)।
मुझे लगता है कि ऐसा करने का सबसे स्पष्ट तरीका aligned_storage
(या TR1 के, यदि आपके पास है) के बूस्ट के कार्यान्वयन का उपयोग करना होगा। यदि आप यह नहीं चाहते हैं, तो भी मैं आपके अधिकांश कोड में मानक संस्करण का उपयोग करने के बारे में कड़ी मेहनत करूँगा, और अपने स्वयं के उपयोग के लिए केवल एक छोटा सा कार्यान्वयन लिखूंगा जब तक आप मानक को लागू करने वाले कंपाइलर को अपडेट न करें। पोर्टेबल कोड, हालांकि, अभी भी __declspec(align...
या __attribute__(__aligned__, ...
जैसे कुछ का उपयोग करता है, उससे थोड़ा अलग दिखाई देगा।
विशेष रूप से, यह आपको अनुरोधित संरेखण के साथ अनुरोधित आकार का कच्चा बफर देता है। उस भंडारण में आपके प्रकार की ऑब्जेक्ट बनाने के लिए प्लेसमेंट नया जैसी कुछ चीज़ों का उपयोग करने के लिए यह आपके ऊपर है।
struct foo {
int a, b, c;
void *operator new(size_t, void *in) { return in; }
};
int main() {
stdx::aligned_storage<sizeof(foo), 8>::type buf;
foo& f = *new (static_cast<void*>(&buf)) foo();
int address = *reinterpret_cast<int *>(&f);
if (address & 0x3 != 0)
std::cout << "Failed.\n";
f.~foo();
return 0;
}
के
:
template <std::size_t Len, std::size_t Alignment>
struct aligned_storage {
typedef struct {
__attribute__(__aligned__(Alignment)) unsigned char __data[Len];
} type;
};
एक त्वरित परीक्षण कार्यक्रम इस का उपयोग करने के लिए कैसे दिखाने के लिए:
क्या इसके लायक है के लिए, यहाँ aligned_storage
के एक कार्यान्वयन पर एक त्वरित वार जीसीसी के __attribute__(__aligned__,...
निर्देश के आधार पर बेशक, असली उपयोग में आप यहां दिखाए गए अधिकांश कुरूपता को लपेट/छुपाएंगे। यदि आप इसे इस तरह छोड़ देते हैं, तो सैद्धांतिक/भविष्य की पोर्टेबिलिटी की कीमत शायद अधिक है।
स्रोत
2012-06-08 15:39:17
मैं उत्सुक हूं; यह क्यों मायने रखता है कि 32-बिट सिस्टम पर संरेखण क्या है? या, वास्तव में, 64-बिट सिस्टम पर, क्योंकि उस संरचना को आमतौर पर 32-बिट से अधिक संरेखित होने की आवश्यकता नहीं होती है। –
एक बार जब संकलक इसका समर्थन करते हैं, तो आप alignas का उपयोग कर सकते हैं। – PlasmaHH
@ जोनाथनफिल्लर: मैं कुछ स्वचालित एसएस अनुकूलन के लिए अनुमति देना चाहूंगा। जीसीसी ने हाल ही में कुछ __builtin_assume_aligned को संकलक को बताने के लिए जोड़ा है कि सामान को गठबंधन होने की उम्मीद है। Http://gcc.godbolt.org/ उदाहरणों के साथ खेलना अधिक अंतर्दृष्टि दे सकता है। – PlasmaHH