在很多机器上,比如Cell,要求数据结构必须128位对齐。这就对数据结构的定义提出了额外的要求。
一种较直观的方法是:在数据结构中添加pad字节,使得整个数据结构填充为128位,例如:
typedef struct _alf_error_msg{
int error_code;
int error_type;
int extra_error_code;
int error_handle_policy;
unsigned char _pad[128 - 4*4];
} error_msg;
其中_pad数组既是为了使整个数据结构达到128位字节而额外填充的字节。
然而,如果数据结构中出现可变化的结构,如使用#ifdef进行条件编译,那填充字节又该如何确定?
这里有一个trick,可以实现该功能:
typedef union _alf_error_msg{
struct error_msg_content{
int error_code;
int error_type;
#ifdef contion_1
int extra_error_code;
#endif
int error_handle_policy;
}
unsigned char _pad[(sizeof(struct error_msg_content) + 127) & 0xFF80];
} error_msg;
在这里由于extra_error_code不能保证始终存在,因此我们不能确定_pad的字节数。在这里我们使用联合数据类型,将_pad的字节数确定为保证容纳struct _error_msg_content的最小字节数。
根据算法(sizeof(struct) + 127) & 0xFF80,可以确保这点。 注意0x80=128,这点可以确保128位对齐。
一种较直观的方法是:在数据结构中添加pad字节,使得整个数据结构填充为128位,例如:
typedef struct _alf_error_msg{
int error_code;
int error_type;
int extra_error_code;
int error_handle_policy;
unsigned char _pad[128 - 4*4];
} error_msg;
其中_pad数组既是为了使整个数据结构达到128位字节而额外填充的字节。
然而,如果数据结构中出现可变化的结构,如使用#ifdef进行条件编译,那填充字节又该如何确定?
这里有一个trick,可以实现该功能:
typedef union _alf_error_msg{
struct error_msg_content{
int error_code;
int error_type;
#ifdef contion_1
int extra_error_code;
#endif
int error_handle_policy;
}
unsigned char _pad[(sizeof(struct error_msg_content) + 127) & 0xFF80];
} error_msg;
在这里由于extra_error_code不能保证始终存在,因此我们不能确定_pad的字节数。在这里我们使用联合数据类型,将_pad的字节数确定为保证容纳struct _error_msg_content的最小字节数。
根据算法(sizeof(struct) + 127) & 0xFF80,可以确保这点。 注意0x80=128,这点可以确保128位对齐。