2012-09-06 3 views
6
gcc (GCC) 4.7.0 
c89 
x86_64 

こんにちは、__attribute __(__ packed__)を使ったパディング構造は本当に価値がありますか?私は疑問に思って

は、それが構造上__attribute__ ((__packed__))を使用して使用して価値があります。それによって構造がより小さくなると私には思われます。私は以下のテストを行った。だからそれを使うとサイズが有利になるでしょう。

他のコンパイラ間で互換性がないため、使用しないケースです。したがって、Visual Studio C++ではこれは機能しません。その他のコンパイラも同様です。

コンパイラはコードを最適化していませんか?だから、実際にそれをコンパイラに任せて、何をすべきかを決めることはパフォーマンスにとっては良いでしょうか?

aligned属性を使用すると違いがありますか?私はそれが任意の提案のために12

感謝のサイズを返したことを加えた__attribute__((packed, aligned(4)))

#include <stdio.h> 

struct padded { 
    int age;  /* 4     */ 
    char initial; /* 1 + 3 padded bytes */ 
    int weight; /* 4  --> total = 12 */ 
}; 

struct __attribute__ ((__packed__)) unpadded { 
    int age;  /* 4     */ 
    char initial; /* 1     */ 
    int weight; /* 4 --> total = 9 */ 
}; 

int main(int argc, char **argv) 
{ 
    struct padded padded_test; 
    struct unpadded unpadded_test; 

    printf("Padded [ %ld ]\n", sizeof(struct padded)); 
    printf("Unpadded [ %ld ]\n", sizeof(struct unpadded)); 
    return 0; 
} 
+4

アライメントされていないメモリアクセスが遅い – BlackBear

+0

あなたの構造の例では、それを梱包して、それを詰め込むことは特に価値がありません。スペースを節約しないで、 'weight'フィールドの位置をずらすだけです。そのように定義されたいくつかの既存のレイアウトとマッチすることが唯一の理由です(あなたのプラットフォーム上の 'int'のオブジェクト表現が' age'フィールドなどに対して正しいことを前提としています)。 –

答えて

13

アンアラインドメモリアクセスは、(例えばIA64、SPARC64)いくつかのアーキテクチャ上の恐ろしく遅くなることがあります。 __attribute__((__packed__))は主にデータをワイヤで送信し、レイアウトを確認したい場合に使用します。メモリ内の領域を節約するためにそれを使用しようとする価値はありません。

の場合、__attribute__((__packed__))を有線伝送に使用することを検討してください。それはエンディアンを扱わず、非標準です。マーシャリングコードを自分で作成する方が安全です。ライブラリ(プロトコルバッファなど)を使用する方がスマートです。

+0

+1、正確かつポイントまで直線。 –

+2

すでに定義されているフォーマット(パブリックプロトコルなど)の送信に '' __packed__ 'を使うことができるだけで、 '' htonl' 'のようなエンディアンを扱うことができます。しかし、それでもそれほど価値があるわけではありません。スペックに合った構造体を書いているので、フィールドのサイズとオフセットを明示的にコーディングすることができます。 –

0

もう1つの__attribute__((packed))は、メモリマップコントローラにアクセスするためのものです。他の人が示唆しているように、非常に特定のものを除いては本当に有用ではありません。アラインされていないアクセスは悪く、一部のアーキテクチャでは例外を生成します。

関連する問題