2009-05-27 4 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 [] someUnsignedLongの後に表示され、の要素someUnsignedLongArray []の要素は、の後に表示されますeLong)。これは可能ですか?

おかげ


更新:

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

(11.1) 指定されていないどのようにファイルに構造体を作成するのですか? – tstenner

+0

あなたはあなたがあなたの考えを見ていることは確かですつまり、各要素に固有のビットパターンを書いてファイルにトレースすることができますか?#pragma pack(もしあれば)をstructの周りで使用していますか? –

+0

おそらく、彼は構造体の要素の代わりに構造体のバイトをファイルに書き込んでいます。 – pyon

答えて

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: 介在アクセス指定子せずに宣言 (非組合)クラスの

非静的データメンバは を割り当てられています後のメンバはクラス オブジェクト内の 上位アドレスを持つようにします。 アクセス指定子で区切ら 非静的データメンバの割り当ての順序は「

+0

あなたはこれについての引用を持っている場合はちょうど興味がありますか?私はあなたが間違っていると言っているわけではありませんが、引用しておくと便利です。 –

+0

私はそれがアクセス指定子ブロック内で並べ替えることができないPODだと思います。非PODには、注文要件は一切ありません。しかし、あなたはDoug Tのためにとにかくそれを探していて、私のコピーは階上にあるので、私はあなたにチェックさせてくれる;-) –

+0

oof、私はそれを見ているほうがいいと思う...;) 9.2 .12は、 "間接アクセス指定子なしで宣言された(非ユニオン)クラスの非静的データメンバーは、後のメンバーがクラスオブジェクト内でより高いアドレスを持つように割り当てられます。不特定(11.1)。 @onebyone:興味深いことに、PODとnon-PODは何も言わないようです。あなたがそれについて確信しているなら、私はあなたにそれを見せさせるでしょう。 ;) – jalf

6
:完全性については

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

、ここでは完全な構造体である:要求されたとして、私は次を使用して構造を書いています

詳しくはAutomated field re-ordering in C structs to avoid paddingWhy doesn't GCC optimize structs?をご覧ください。 。

「反転」とは何を意味するのか分かりません。おそらくコードと出力を追加する必要があります。

+0

私が逆に言うと、someUnsignedLongArray []内の要素がsomeLongの直後に現れることを意味します。私はその質問を明確にするでしょう。 – Lehane

関連する問題