खोज…
परिचय
C ++ में सभी प्रकार का एक संरेखण है। यह स्मृति पते पर प्रतिबंध है कि उस प्रकार की वस्तुओं को भीतर बनाया जा सकता है। एक मेमोरी एड्रेस किसी ऑब्जेक्ट के निर्माण के लिए वैध होता है यदि ऑब्जेक्ट के एलाइनमेंट द्वारा उस एड्रेस को विभाजित किया जाए तो यह पूरी संख्या है।
प्रकार संरेखण हमेशा दो की शक्ति होती है (1 सहित)।
टिप्पणियों
मानक निम्नलिखित की गारंटी देता है:
- एक प्रकार की संरेखण आवश्यकता इसके आकार का एक विभाजक है। उदाहरण के लिए, 16 बाइट्स वाले एक वर्ग में 1, 2, 4, 8, या 16 का संरेखण हो सकता है, लेकिन 32 नहीं। (यदि किसी वर्ग के सदस्यों के आकार में कुल 14 बाइट्स हैं, लेकिन कक्षा को संरेखण की आवश्यकता है 8 का, संकलक वर्ग के आकार को 16 के बराबर बनाने के लिए 2 पैडिंग बाइट्स सम्मिलित करेगा।)
- पूर्णांक प्रकार के हस्ताक्षरित और अहस्ताक्षरित संस्करणों की एक ही संरेखण आवश्यकता होती है।
- करने के लिए एक सूचक
void
के सूचक के रूप में एक ही संरेखण आवश्यकता हैchar
। - एक प्रकार के सीवी-योग्य और सीवी-अयोग्य संस्करणों की एक ही संरेखण आवश्यकता होती है।
ध्यान दें कि जबकि संरेखण सी ++ 03 में मौजूद है, यह सी जब तक ++ 11 नहीं था कि यह क्वेरी संरेखण (उपयोग करने के लिए संभव हो गया alignof
) और नियंत्रण संरेखण (का उपयोग कर alignas
)।
एक प्रकार के संरेखण को छोड़कर
एक प्रकार की संरेखण आवश्यकता को एक संचालक के रूप में alignof
कीवर्ड का उपयोग करके देखा जा सकता है। परिणाम प्रकार std::size_t
का एक स्थिर अभिव्यक्ति है, अर्थात, इसका संकलन समय पर मूल्यांकन किया जा सकता है।
#include <iostream>
int main() {
std::cout << "The alignment requirement of int is: " << alignof(int) << '\n';
}
संभव उत्पादन
इंट की संरेखण आवश्यकता है: 4
यदि किसी सरणी पर लागू किया जाता है, तो यह तत्व प्रकार के संरेखण की आवश्यकता को पूरा करता है। यदि एक संदर्भ प्रकार पर लागू किया जाता है, तो यह संदर्भित प्रकार की संरेखण आवश्यकता को पूरा करता है। (संदर्भ स्वयं कोई संरेखण नहीं है, क्योंकि वे ऑब्जेक्ट नहीं हैं।)
संरेखण को नियंत्रित करना
alignas
कीवर्ड का उपयोग किसी चर, वर्ग डेटा सदस्य, किसी वर्ग की घोषणा या परिभाषा, या alignas
परिभाषा या परिभाषा को एक विशेष संरेखण करने के लिए किया जा सकता है, यदि समर्थित हो। यह दो रूपों में आता है:
-
alignas(x)
, जहांx
एक स्थिर अभिव्यक्ति है, इकाई को संरेखणx
, यदि समर्थित है। -
alignas(T)
, जहांT
एक प्रकार है, यदि समर्थित है, तो इकाई कोT
के संरेखण की आवश्यकता के बराबर एक संरेखण प्रदान करता है,alignof(T)
यदि समर्थन किया गया है।
यदि एक ही इकाई में कई alignas
जाते हैं, तो सबसे सख्त लागू होता है।
इस उदाहरण में, बफर buf
को एक int
ऑब्जेक्ट को रखने के लिए उचित रूप से संरेखित किए जाने की गारंटी है, भले ही इसका तत्व प्रकार unsigned char
, जिसमें एक कमजोर संरेखण आवश्यकता हो सकती है।
alignas(int) unsigned char buf[sizeof(int)];
new (buf) int(42);
alignas
एक प्रकार प्रकार तुलना में एक छोटे संरेखण इस घोषणा के बिना होता देने के लिए इस्तेमाल नहीं किया जा सकता है:
alignas(1) int i; //Il-formed, unless `int` on this platform is aligned to 1 byte.
alignas(char) int j; //Il-formed, unless `int` has the same or smaller alignment than `char`.
alignas
, जब पूर्णांक स्थिर अभिव्यक्ति दिया जाता है, तो एक मान्य संरेखण दिया जाना चाहिए। मान्य संरेखण हमेशा दो की शक्तियां होती हैं, और शून्य से अधिक होनी चाहिए। कंपाइलर्स को सभी मान्य संरेखण का समर्थन करने के लिए आवश्यक है प्रकार के संरेखण के लिए std::max_align_t
। वे इससे बड़े संरेखण का समर्थन कर सकते हैं , लेकिन ऐसी वस्तुओं के लिए स्मृति आवंटित करने का समर्थन सीमित है। संरेखण पर ऊपरी सीमा कार्यान्वयन पर निर्भर है।
C ++ 17 अधिक संरेखित प्रकारों के लिए मेमोरी आवंटित करने के लिए operator new
में प्रत्यक्ष समर्थन प्रदान करता है।