27
#pragma pack(L1_CACHE_LINE)
struct A {
  //...
};
#pragma pack()

A a;

struct A {
  //...
};

A a __attritube__((aligned(L1_CACHE_LINE)))

それらの違いは何ですか?

4

2 に答える 2

19
于 2016-10-14T12:26:24.900 に答える
15

#pragma pack(byte-alignment)は、byte-alignment入力で指定された構造体の各メンバー、またはそれらの自然な整列境界のいずれか小さい方に影響します。

変数(または構造体内で指定されている場合は構造体フィールド)の__attribute__((aligned(byte-alignment)))最小配置に影響します

以下は同等だと思います

#define L1_CACHE_LINE 2

struct A
{
    u_int32_t   a   __attribute__ ( (aligned(L1_CACHE_LINE)) );
    u_int32_t   b   __attribute__ ( (aligned(L1_CACHE_LINE)) );
    u_int16_t   c   __attribute__ ( (aligned(L1_CACHE_LINE)) );       
    u_int16_t   d   __attribute__ ( (aligned(L1_CACHE_LINE)) );      
    u_int32_t   e   __attribute__ ( (aligned(L1_CACHE_LINE)) );     
};


#pragma pack(L1_CACHE_LINE)
struct A
{
    u_int32_t   a;  
    u_int32_t   b;  
    u_int16_t   c;  
    u_int16_t   d;  
    u_int32_t   e;  
};
#pragma pack()

ここで、Aは、内部が2バイトに整列さa __attritube__((aligned(L1_CACHE_LINE)))れることを保証しますが、他の変数を同じ方法で整列しません。u_int32_t astruct A

参照:

  1. http://publib.boulder.ibm.com/infocenter/macxhelp/v6v81/index.jsp?topic=%2Fcom.ibm.vacpp6m.doc%2Fcompiler%2Fref%2Frnpgpack.htm
  2. http://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/attributes-variables.html
于 2013-01-06T06:32:45.090 に答える