#pragma pack
संकलक को विशेष संरेखण के साथ संरचना के सदस्यों को पैक करने का निर्देश देता है। अधिकांश कंपाइलर, जब आप एक संरचना की घोषणा करते हैं, तो यह सुनिश्चित करने के लिए सदस्यों के बीच पैडिंग डालेंगे कि वे मेमोरी में उपयुक्त पते (आमतौर पर कई प्रकार के आकार) से जुड़े हैं। यह पहुंच मार्ग से जुड़े कुछ आर्किटेक्चर पर प्रदर्शन जुर्माना (या एकमुश्त त्रुटि) से बचा जाता है जो ठीक से संरेखित नहीं हैं। उदाहरण के लिए, दिए गए 4-बाइट पूर्णांकों और निम्नलिखित संरचना:
struct Test
{
char AA;
int BB;
char CC;
};
संकलक इस तरह से स्मृति में संरचना को बाहर करना चुन सकता है:
| 1 | 2 | 3 | 4 |
| AA(1) | pad.................. |
| BB(1) | BB(2) | BB(3) | BB(4) |
| CC(1) | pad.................. |
और sizeof(Test)
4 × 3 = 12 होगा, भले ही इसमें केवल 6 बाइट डेटा हो। #pragma
(मेरी जानकारी में) के लिए सबसे आम उपयोग मामला हार्डवेयर उपकरणों के साथ काम करते समय होता है जहां आपको यह सुनिश्चित करने की आवश्यकता होती है कि कंपाइलर डेटा में पैडिंग नहीं डालता है और प्रत्येक सदस्य पिछले एक का अनुसरण करता है। इसके साथ #pragma pack(1)
, ऊपर की संरचना इस तरह रखी जाएगी:
| 1 |
| AA(1) |
| BB(1) |
| BB(2) |
| BB(3) |
| BB(4) |
| CC(1) |
और sizeof(Test)
1 × 6 = 6 होगा।
इसके साथ #pragma pack(2)
, ऊपर की संरचना इस तरह रखी जाएगी:
| 1 | 2 |
| AA(1) | pad.. |
| BB(1) | BB(2) |
| BB(3) | BB(4) |
| CC(1) | pad.. |
और sizeof(Test)
2 × 4 = 8 होगा।
संरचना में चर का आदेश भी महत्वपूर्ण है। निम्नलिखित के साथ आदेश दिए गए चर के साथ:
struct Test
{
char AA;
char CC;
int BB;
};
और #pragma pack(2)
, संरचना इस तरह रखी जाएगी:
| 1 | 2 |
| AA(1) | CC(1) |
| BB(1) | BB(2) |
| BB(3) | BB(4) |
और sizeOf(Test)
3 × 2 = 6 होगा।
#pragma
निर्देशों की तरह वे कार्यान्वयन को परिभाषित करते हैं।