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

A a;


struct A {
  //...
};

A a __attritube__((aligned(L1_CACHE_LINE)))

他们之间有什么区别?

最佳答案

pragma pack(字节对齐)按字节对齐输入指定的方式或在其自然对齐边界上(以较小者为准)影响结构的每个成员。
__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()

其中Aa __attritube__((aligned(L1_CACHE_LINE)))将确保u_int32_t a内部的struct A与2字节对齐,但不会以相同的方式对齐其他变量。
参考
http://publib.boulder.ibm.com/infocenter/macxhelp/v6v81/index.jsp?topic=%2Fcom.ibm.vacpp6m.doc%2Fcompiler%2Fref%2Frnpgpack.htm
http://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/attributes-variables.html

关于gcc - “#pragma pack”和“__attribute __((aligned))”之间有什么区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39407675/

10-13 02:02