संरेखण एक प्रतिबंध है जिस पर मेमोरी एक मूल्य की पहली बाइट संग्रहीत की जा सकती है। (यह प्रोसेसर पर प्रदर्शन को बेहतर बनाने और कुछ निर्देशों का उपयोग करने की अनुमति देने के लिए आवश्यक है जो केवल विशेष संरेखण के साथ डेटा पर काम करता है, उदाहरण के लिए SSE को 16 बाइट्स से संरेखित करने की आवश्यकता है, जबकि AVX से 32 बाइट्स के लिए।)
16 के संरेखण का मतलब है कि स्मृति पते जो कि 16 के कई हैं, केवल मान्य पते हैं।
alignas
बाइट्स की आवश्यक संख्या के लिए बल संरेखण। आप केवल 2: 1, 2, 4, 8, 16, 32, 64, 128, ... की शक्तियों के लिए संरेखित कर सकते हैं।
#include <cstdlib>
#include <iostream>
int main() {
alignas(16) int a[4];
alignas(1024) int b[4];
printf("%p\n", a);
printf("%p", b);
}
उदाहरण आउटपुट:
0xbfa493e0
0xbfa49000
1011 1111 1010 0100 1001 0011 1110 0000
1011 1111 1010 0100 1001 0000 0000 0000
दूसरा कीवर्ड
alignof
बहुत सुविधाजनक है, आप ऐसा कुछ नहीं कर सकते
int a[4];
assert(a % 16 == 0);
लेकिन आप कर सकते हैं
assert(alignof(a) == 16);
assert(alignof(b) == 1024);
ध्यान दें कि वास्तव में यह एक सरल "%" (मापांक) ऑपरेशन की तुलना में अधिक सख्त है। वास्तव में हम जानते हैं कि 1024 बाइट्स से जुड़ी कुछ चीजों को 1, 2, 4, 8 बाइट्स से जोड़ दिया जाता है
assert(alignof(b) == 32);
तो अधिक सटीक होने के लिए, "एलायडॉफ़" 2 की सबसे बड़ी शक्ति देता है जो कि कुछ संरेखित है।
एलायफ़ॉफ़ बुनियादी डेटाैटिप्स के लिए अग्रिम न्यूनतम संरेखण आवश्यकता को जानने का एक अच्छा तरीका है (यह संभवत: 1 चार्ट के लिए 1, फ्लोट आदि के लिए 4 लौटेगा)।
अभी भी कानूनी:
alignas(alignof(float)) float SqDistance;
16 के संरेखण के साथ कुछ तब अगले उपलब्ध पते पर रखा जाएगा जो कि 16 का गुणक है (अंतिम उपयोग किए गए पते से एक अंतर्निहित पैडिंग हो सकती है)।