6
gcc (GCC) 4.7.0
c89
x86_64

こんにちは、

__attribute__ ((__packed__))on 構造を使用する価値があるかどうか疑問に思っています。それにより、構造のサイズが小さくなるように思えます。以下で実行したテストに従ってください。したがって、それを使用すると、サイズの利点になります。

他のコンパイラ間で移植できないため、使用しない場合があります。Visual Studio C++ の場合、これは機能しません。さらに、他のコンパイラも同様です。

コンパイラはコードを最適化しませんか? では、実際に何をすべきかを決定するのはコンパイラーに任せた方がパフォーマンスが向上するのでしょうか?

整列属性を使用すると違いはありますか? __attribute__((packed, aligned(4)))私がそれを追加したとき、それは12のサイズを返しました.

ご提案いただきありがとうございます。

#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

2 に答える 2

13

一部のアーキテクチャ (ia64、sparc64 など) では、アラインされていないメモリ アクセスが非常に遅くなる場合があります。 __attribute__((__packed__))主に、ワイヤ経由でデータを送信していて、レイアウトを確認したい場合に使用することを目的としています。メモリのスペースを節約するために使用する価値はありません。

有線伝送での使用を検討している場合は、もう一度考えてみてください。__attribute__((__packed__))エンディアンを処理せず、非標準です。マーシャリング コードを自分で作成する方が安全であり、ライブラリ (プロトコル バッファなど) を使用する方が賢明です。

于 2012-09-06T16:31:27.693 に答える
0

のもう 1 つの用途__attribute__((packed))は、メモリ マップト コントローラーへのアクセスです。他の人が示唆しているように、非常に具体的なことを除いて、あまり役に立ちません。アラインされていないアクセスは良くなく、一部のアーキテクチャでは例外が生成されます。

于 2012-09-09T13:42:18.263 に答える