"#pragma pack"和"#pragma pack"之间有什么区别?和"__attribute __((aligned))" [英] What is the difference between "#pragma pack" and "__attribute__((aligned))"
问题描述
#pragma pack(L1_CACHE_LINE)
struct A {
//...
};
#pragma pack()
A a;
和
struct A {
//...
};
A a __attritube__((aligned(L1_CACHE_LINE)))
它们之间有什么区别?
推荐答案
#pragma pack(byte-alignment)会影响由byte-alignment输入指定的结构的每个成员,或者影响其自然对齐边界,以两者中的任意一个为准较少的.
The #pragma pack(byte-alignment) effect each member of the struct as specified by the byte-alignment input, or on their natural alignment boundary, whichever is less.
__attribute__((aligned(byte-alignment)))
影响变量(如果在struct中指定,则为struct字段)的最小对齐方式
The __attribute__((aligned(byte-alignment)))
affect the minimum alignment of the variable (or struct field if specified within the struct)
我相信以下是等价的
#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 __attritube__((aligned(L1_CACHE_LINE)))
将确保struct A
内部的u_int32_t a
将与2个字节对齐,但不会以相同的方式对齐其他变量.
where is A a __attritube__((aligned(L1_CACHE_LINE)))
will insure u_int32_t a
inside struct A
will aligned with 2 byte but will not align the other variable in the same manner.
参考:
- 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
- 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
这篇关于"#pragma pack"和"#pragma pack"之间有什么区别?和"__attribute __((aligned))"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!