【发布时间】:2015-04-30 19:38:46
【问题描述】:
struct queue_entry_s {
odp_buffer_hdr_t *head;
odp_buffer_hdr_t *tail;
int status;
enq_func_t enqueue ODP_ALIGNED_CACHE;
deq_func_t dequeue;
enq_multi_func_t enqueue_multi;
deq_multi_func_t dequeue_multi;
odp_queue_t handle;
odp_buffer_t sched_buf;
odp_queue_type_t type;
odp_queue_param_t param;
odp_pktio_t pktin;
odp_pktio_t pktout;
char name[ODP_QUEUE_NAME_LEN];
};
typedef union queue_entry_u {
struct queue_entry_s s;
uint8_t pad[ODP_CACHE_LINE_SIZE_ROUNDUP(sizeof(struct queue_entry_s))];
} queue_entry_t;
typedef struct queue_table_t {
queue_entry_t queue[ODP_CONFIG_QUEUES];
} queue_table_t;
static queue_table_t *queue_tbl;
#define ODP_CACHE_LINE_SIZE 64
#define ODP_ALIGN_ROUNDUP(x, align)\
((align) * (((x) + align - 1) / (align)))
#define ODP_CACHE_LINE_SIZE_ROUNDUP(x)\
ODP_ALIGN_ROUNDUP(x, ODP_CACHE_LINE_SIZE)
在上面的代码中,typedef union queue_entry_u,union的意义是什么。如果我们取struct(typedef struct queue_entry_u),有什么缺点吗?
【问题讨论】:
-
您应该查看
ODP_CACHE_LINE_SIZE_ROUNDUP宏,和/或将宏编辑到问题中。基本上,union将填充字节添加到结构中,以便使用的内存是某个理想值的倍数。 -
@user3386109,按照您的要求添加了宏的定义。
-
应该有选择2个接受的答案的选项。两个答案都说明了原因。