अनुभवी प्रोग्रामर के अधिकांश जानते हैं कि कार्यक्रम के प्रदर्शन के लिए डेटा संरेखण महत्वपूर्ण है। मैंने कुछ प्रोग्रामर को प्रोग्राम लिखा है जो उन्हें आवश्यकतानुसार बफर के बड़े आकार आवंटित करता है, और गठबंधन सूचक को शुरू होने के रूप में उपयोग करता है। मुझे आश्चर्य है कि मुझे अपने कार्यक्रम में ऐसा करना चाहिए, मुझे नहीं पता कि सी ++ के नए ऑपरेशन द्वारा दिए गए पते के संरेखण की कोई गारंटी है। इसलिए मैं परीक्षण करने के लिए एक छोटे से कार्यक्रम में लिखा थाक्या सी ++ के नए ऑपरेशन द्वारा एड्रेस रिटर्न के संरेखण की कोई गारंटी है?
for(size_t i = 0; i < 100; ++i) {
char *p = new char[123];
if(reinterpret_cast<size_t>(p) % 4) {
cout << "*";
system("pause");
}
cout << reinterpret_cast<void *>(p) << endl;
}
for(size_t i = 0; i < 100; ++i) {
short *p = new short[123];
if(reinterpret_cast<size_t>(p) % 4) {
cout << "*";
system("pause");
}
cout << reinterpret_cast<void *>(p) << endl;
}
for(size_t i = 0; i < 100; ++i) {
float *p = new float[123];
if(reinterpret_cast<size_t>(p) % 4) {
cout << "*";
system("pause");
}
cout << reinterpret_cast<void *>(p) << endl;
}
system("pause");
संकलक मैं उपयोग कर रहा हूँ विजुअल C++ एक्सप्रेस 2008 ऐसा लगता है कि सभी पतों नई लौटे आपरेशन गठबंधन कर रहे हैं। किंतु मुझे यकीन नहीं है। तो मेरा सवाल है: क्या कोई गारंटी है? अगर उनके पास गारंटी है, तो मुझे खुद को संरेखित करने की ज़रूरत नहीं है, अगर नहीं, तो मुझे करना होगा।
सिद्धांत में। अभ्यास में, यदि आप 32-बिट सिस्टम पर जीसीसी + ग्लिब और एसएसई प्रकार का उपयोग कर रहे हैं, तो http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15795 से अवगत रहें। – timday
@ टिमडे: एसएसई प्रकारों के साथ यह समस्या एमएसवीसी ++ (उदाहरण के लिए .NET 2003) के हाल के संस्करणों के बारे में भी सच थी। नवीनतम संस्करण पर परीक्षण नहीं किया है, लेकिन मुझे संदेह है कि यह अभी भी मामला है। –
'ऑपरेटर नया []()' सहायक आवंटन फ़ंक्शन, जो कि आवश्यकता की चिंताओं से लौटाया गया मान, वही सूचक नहीं है जिसे आप 'नए []' ऑपरेटर से प्राप्त करते हैं। यह जवाब गलत है। –