2017-04-11 7 views
-2

次のコードWTH 2つの質問は:構造体/クラスは何とかメモリパディングに影響しますか?

struct Value 
{ 
    int value 
} 

void main() 
{ 
    Value v1; 
    Value v2; 

    int a; 
    int b; 

    return 0; 
} 

1)なぜ私の変数のメモリアドレスは、下向きの機能に保存されていますか?
V1 - > 0x00007fff5fbff758
V2 - >

しかし、私の構造体で、たとえば、彼らは他の方向に格納されている0x00007fff5fbff750?例: Valueに別の変数int value_2がある場合

v1.value - > 0x00007fff5fbff750
v2.value_2 - > 0x00007fff5fbff754

2) なぜメモリおよびINT B連続int型であり、なぜメモリにV1とV2連続していません。

どのような種類のアライメントは認識されていませんか?

+1

CまたはC++?彼らは異なっており、Cは 'クラス 'を持っていません。 – NathanOliver

+0

パディングを持つこともできないこともあり、変数は任意の順序で格納できます。これはすべて実装に依存します。 –

+1

あなたのコードには 'value_2'はありません。 –

答えて

0

1)変数が格納される順序を決定するのはコンパイラです。関数の変数がプッシュダウン順にスタックに格納されているにもかかわらず、v1が最初にプッシュされ、次にv2がv2がv1の下にあることは意味があります。

反対に、構造体内の順序は宣言(C仕様のどこかにある)に従わなければなりません。その理由は、構造体が配列やその他のメモリマップされた領域をオーバーレイする可能性があります。その領域では、変数が特定の順序と位置合わせになっているかどうかを確認する必要があります。

2)わかりませんが、最適化のために構造体を8バイト境界に揃えることを決めました(64ビットコンパイラを使用しているようですので、8バイトは「自然な」配列です)。

+0

8byteアライメントは真であるようだ、 8bytesを超えると、16byteアライメントになります なぜこのアライメントは構造内のアライメントと異なっていますか? 私が知っている限り構造変数は '最大タイプ'にアライメントされています – Sleicreider

+0

この8バイトアライメントはキャッシュラインにも影響しますか? 私のオブジェクトは4バイトしか使用しませんが、(最適化のために)8バイト整列されているので、実際にはキャッシュラインのスペースが無駄になります。 – Sleicreider

+0

キャッシュラインはレジスタの幅に対して最適化されていると見なすことができます。逆もまた同様です。しかしこれはすべて「コンパイラの最適化」と呼ばれる暗いブードゥーの一部です:)そして、あなたは4バイトを無駄にするかもしれませんが、パフォーマンスは良くなります。必要に応じて、より小さい構造を強制する__pragma__オプションがおそらくあります。 – JvO

関連する問題