2015-06-24 5 views
7

में प्रगमा पैक निर्देश का दायरा दृश्य C++ में #pragma pack संरेखण का दायरा क्या है? API संदर्भ https://msdn.microsoft.com/en-us/library/vstudio/2e70t5y1%28v=vs.120%29.aspx का कहना है:विजुअल स्टूडियो

पैक पहली struct पर प्रभावी होता है, संघ, या वर्ग घोषणा pragma के बाद

निम्न कोड के लिए एक परिणाम के रूप

तो देखा जाता है:

#include <iostream> 

#pragma pack(push, 1) 

struct FirstExample 
{ 
    int intVar; // 4 bytes 
    char charVar; // 1 byte 
}; 

struct SecondExample 
{ 
    int intVar; // 4 bytes 
    char charVar; // 1 byte 
}; 


void main() 
{ 
    printf("Size of the FirstExample is %d\n", sizeof(FirstExample)); 
    printf("Size of the SecondExample is %d\n", sizeof(SecondExample)); 
} 

मैं उम्मीद कर लिए हैं:

Size of the FirstExample is 5 
Size of the SecondExample is 8 

लेकिन मैं प्राप्त किया है:

Size of the FirstExample is 5 
Size of the SecondExample is 5 

है यही कारण है कि मैं एक छोटे से हैरान हूँ और मैं वास्तव में किसी भी स्पष्टीकरण प्रदान कर सकते हैं की सराहना करते हैं।

+1

आपकी दोनों संरचनाएं फ़ाइल में प्रज्ञा के बाद स्थित हैं। अगर वे अलग हैं तो मुझे आश्चर्य होगा। आपका आउटपुट दो 'फर्स्टएक्स नमूना' लाइन दिखाता है, इसलिए यह आपके स्रोत कोड से मेल नहीं खाता है ... – Jay

+0

@Jay आपकी टिप्पणी के लिए धन्यवाद। मैंने इस गलती को सही कर दिया है। – rgb

उत्तर

5

बुलाना चाहिए सिर्फ इसलिए कि यह "पहले struct पर प्रभावी होता है" मतलब यह नहीं है कि उसके प्रभाव के लिए सीमित है वह पहला संरचना। #pragma pack प्रीप्रोसेसर निर्देश के लिए एक सामान्य तरीके से काम करता है: यह किसी भी भाषा-स्तरीय क्षेत्रों को अनदेखा करते हुए सक्रियण के बिंदु से "अनिश्चित काल तक" रहता है, यानी इसका प्रभाव अनुवाद इकाई के अंत तक फैलता है (या किसी अन्य #pragma pack द्वारा ओवरराइड किए जाने तक)।

4

प्रगामा के बाद पहली संरचना, संघ या वर्ग घोषणा पर प्रभाव पड़ता है और पहले सामना #pragma पैक (पॉप) या किसी अन्य #pragma पैक (पुश) तक रहता है जो इसके पॉप-समकक्ष के पास रहता है।

(धक्का और आम तौर पर जोड़े में आते हैं पीओपी)

2

आप #pragma pack(pop) से पहले SecondExample

#include <iostream> 
#pragma pack(push, 1) 

struct FirstExample 
{ 
    int intVar; // 4 bytes 
    char charVar; // 1 byte 
}; 

#pragma pack(pop) 

struct SecondExample 
{ 
    int intVar; // 4 bytes 
    char charVar; // 1 byte 
}; 


void main() 
{ 
printf("Size of the FirstExample is %d\n", sizeof(FirstExample)); 
printf("Size of the SecondExample is %d\n", sizeof(SecondExample)); 
} 
संबंधित मुद्दे