2009-05-27 139 views
8

C++編譯器(特別是g ++)是否可以重新排序結構的內部元素?C++編譯器是否可以重新排序結構中的元素

我看到一些奇怪的行爲,我有一個包含類似如下結構:

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

當我寫這個輸出到文件,someUnsignedLongArraysomeLongArray的順序似乎在被反轉(即,元件someLongArray []出現後someUnsignedLongsomeUnsignedLongArray []索姆出現的元素eLong)。這可能嗎??

感謝


更新:

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

爲了完整起見,這裏是完整的結構:

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

你怎麼寫的結構到一個文件? – tstenner 2009-05-27 16:18:54

+0

你確定你看到你認爲你看到了嗎?ie你是否在每個元素中寫入了獨特的位模式,並且可以將它們跟蹤到文件中?還有,你在結構體周圍使用了什麼樣的#pragma pack(如果有的話)? – 2009-05-27 16:29:52

+0

也許他正在將結構的字節而不是結構的元素寫入文件。 – pyon 2009-05-27 16:31:27

回答

26

它通常不能重新排序元素,沒有。

的一個例外是如果有一個訪問說明符將它們分離:

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

a,b和c的保證將要存儲在這個順序,並且d,e和f是保證將要存儲在順序。但是,關於a,b和c相對於d,e和f的存儲位置沒有保證。

要記住的另一件事是編譯器可以插入儘可能多的填充,即使它不重新排序。

下面是標準的相關部分:

第9.2.12:

一個 (非工會)的

非靜態數據成員沒有 宣佈介入訪問符類中 分配以便後來的成員在 對象內有更高的地址。由一個 訪問符分隔 非靜態數據成員分配的順序是不確定的 (11.1)」

相關問題