2009-05-27 14 views
8

में पुन: ऑर्डर तत्व कर सकता है क्या एक सी ++ कंपाइलर (विशेष रूप से g ++) संरचना के आंतरिक तत्वों को फिर से ऑर्डर कर सकता है?क्या एक सी ++ संकलक एक संरचना

Struct SomeStruct{ 
    ... 
    ... 
    long someLong; 
    long someLongArray[25]; 
    unsigned long someUnsignedLong; 
    unsigned long someUnsignedLongArray[8]; 
    unsigned long int someUnsignedLongInt; 
    ... 
    ... 
}; 

जब मैं उत्पादन इस फाइल करने के लिए, someUnsignedLongArray और someLongArray के आदेश लिखने के लिए लग रहे हैं:

मैं कुछ अजीब व्यवहार जहां मैं एक संरचना है कि जैसे निम्नलिखित कुछ शामिल है दिखाई दे रही है में ही उल्टा हो (तत्वों यानी someLongArray [] दिखाई someUnsignedLong और की someUnsignedLongArray []som के बाद दिखाई देते तत्वों के बाद ईलॉन्ग)। क्या यह संभव है??

धन्यवाद


अद्यतन:

struct SomeStruct{ 
byte someByte; 
byte someByteArray[6]; 
char someChar; 
char someCharArray[5]; 
char someCharArrayArray[3][5]; 
short someShort; 
signed short someShortArray[2]; 
unsigned short someUnsignedShort; 
unsigned short someUnsignedShortArray[8]; 
int someInt; 
int someIntArray[3]; 
int someIntArrayArrayArrayArray[4][3][2][6]; 
int *pSomeInt; 
unsigned int someUnsignedInt; 
unsigned int someUnsignedIntArray[9]; 
long someLong; 
long someLongArray[25]; 
unsigned long someUnsignedLong; 
unsigned long someUnsignedLongArray[8]; 
unsigned long int someUnsignedLongInt; 
long long someLongLong; 
long long someLongLongArray[5]; 
bool someBool; 
bool someBoolArray[3]; 
unsigned long long someUnsignedLongLong; 
unsigned long long someUnsignedLongLongArray[5]; 
unsigned long long someUnsignedLongLongArrayArray[5][2]; 
unsigned long long int *pSomeUnsignedLongLongInt; 
}; 
+0

आप कैसे एक फाइल करने के लिए struct लिख सकता हूँ? – tstenner

+0

आप सुनिश्चित रूप से देख रहे हैं कर रहे हैं कि तुम क्या आपको लगता है देख रहे हैं? यानी आपने प्रत्येक तत्व में अद्वितीय बिट पैटर्न लिखे हैं और उन्हें फ़ाइल में ढूंढ सकते हैं? इसके अलावा #pragma पैक (यदि कोई है) क्या आप संरचना के चारों ओर उपयोग कर रहे हैं? –

+0

शायद वह संरचना के तत्वों की बजाय, फ़ाइल के लिए संरचना के बाइट्स लिख रहा है। – pyon

उत्तर

26

यह आमतौर पर तत्वों को पुन: व्यवस्थित नहीं कर सकता है, नहीं।

struct Foo {  
    A a; 
    B b; 
    C c; 
private: 
    D d; 
    E e; 
    F f; 
}; 

एक, बी और सी इस क्रम में संग्रहीत करने के लिए गारंटी दी जाती है, और डी, ई और एफ क्रम में संग्रहीत करने के लिए गारंटी दी जाती है: वहाँ एक पहुँच विनिर्देशक उन्हें अलग है कि अगर

एक अपवाद है। लेकिन डी, ई और एफ के सापेक्ष ए, बी और सी संग्रहीत किए जाने के बारे में कोई गारंटी नहीं है।

ध्यान में रखना एक और बात यह है कि संकलक जितना चाहें उतना पैडिंग डाल सकता है, भले ही यह कुछ भी पुन: व्यवस्थित न हो।

धारा 9.2.12:

एक (गैर संघ) की Nonstatic डेटा सदस्यों वर्ग बीच पहुँच-विनिर्देशक एक बिना घोषित आवंटित किए जाते हैं

यहाँ मानक के प्रासंगिक हिस्सा है ताकि बाद के सदस्यों को कक्षा ऑब्जेक्ट के भीतर उच्च पते हो। nonstatic डेटा एक पहुँच-विनिर्देशक द्वारा अलग सदस्यों के आवंटन के आदेश अनिर्दिष्ट है (11.1) "

+0

अगर आपके पास इसका उद्धरण है तो बस उत्सुक है? मैं यह नहीं कह रहा कि आप गलत हैं, लेकिन यह उद्धरण के लिए उपयोगी होगा। –

+0

मुझे लगता है कि यह केवल पीओडी है जिसे एक्सेस-विनिर्देशक ब्लॉक के भीतर पुन: व्यवस्थित नहीं किया जा सकता है। गैर-पीओडी के पास कोई ऑर्डर आवश्यकता नहीं है। लेकिन चूंकि आप इसे डॉग टी के लिए देख रहे हैं, और मेरी प्रतिलिपि ऊपर की तरफ है, मैं आपको चेक दूंगा ;-) –

+0

ओओफ़, अनुमान लगाएं कि मैं इसे बेहतर तरीके से देखूंगा ...;) 9.2 .12 कहता है "बिना किसी हस्तक्षेप पहुंच-विनिर्देशक के घोषित एक (गैर-संघीय) वर्ग के गैरस्टिक डेटा सदस्यों को आवंटित किया जाता है ताकि बाद के सदस्यों को कक्षा वस्तु के भीतर उच्च पते हो। गैर-डेटा संबंधी डेटा सदस्यों के आवंटन का आदेश एक अभिगम-विनिर्देशक द्वारा अलग किया गया निर्दिष्ट नहीं है (11.1)। " @onebyone: दिलचस्प बात यह है कि यह पीओडी बनाम गैर-पीओडी के बारे में कुछ भी नहीं कहता है। यदि आप इसके बारे में निश्चित हैं, तो मैं आपको इसे देखने दूंगा। ;) – jalf

6
:

int fd = open(fspec,O_RDWR|O_CREAT|O_TRUNC,0666); 
int writeRes = write(fd,(char *)&someStruct,sizeof(SomeStruct)); 

पूर्णता के लिए, यहाँ पूर्ण struct है: के रूप में अनुरोध किया है, मैं बाहर संरचना का उपयोग निम्नलिखित लिख रहा हूँ

यह नहीं देख सकता है, Automated field re-ordering in C structs to avoid padding और Why doesn't GCC optimize structs? को और जानकारी के लिए देखें ।

मुझे नहीं पता कि "उल्टा" के साथ आपका क्या मतलब है, शायद आपको कुछ कोड और आउटपुट जोड़ना चाहिए।

+0

जब मैं उलटा कहता हूं, मेरा मतलब है कि कुछ unnsignedLongArray [] में तत्व कुछ लंबे समय बाद सीधे दिखाई देते हैं। मैं सवाल स्पष्ट कर दूंगा। – Lehane

संबंधित मुद्दे