有时
,出于性能原因,我可能会决定定义一个结构,例如
typedef struct {
size_t capacity;
size_t size;
int offset;
void* data[];
} ring_buffer;
在结构本身中内联data
。我目前正在将创建函数定义为
ring_buffer* ring_buffer_create(size_t capacity) {
int struct_size =
sizeof(int) + 2 * sizeof(size_t) +
capacity * sizeof(void*);
ring_buffer* rb = (ring_buffer*)malloc(struct_size);
rb->capacity = capacity;
rb->offset = 0;
rb->size = 0;
return rb;
}
只要 C 编译器不做一些奇怪的字段填充/对齐,它(如果我没有计算错误(就可以正常工作。
人们通常如何处理这种情况(当然,除了将data
定义为指针之外(?
谢谢
您的大小计算不正确:结构可能具有嵌入式填充以确保其某些成员的对齐。例如,在 64 位目标上,int
为 4 个字节,后面的 void *data[]
数组需要 8 字节对齐,因此编译器将在 data
成员之前插入 4 个字节的填充。
大小应按以下方式计算:
size_t struct_size = sizeof(ring_buffer) + capacity * sizeof(void *);
或者可能:
size_t struct_size = offsetof(ring_buffer, data) + capacity * sizeof(void *);
请注意,size
应具有类型 size_t
,并且应测试malloc
故障以避免未定义的行为:
ring_buffer *ring_buffer_create(size_t capacity) {
size_t struct_size = sizeof(ring_buffer) + capacity * sizeof(void *);
ring_buffer *rb = malloc(struct_size);
if (rb) {
rb->capacity = capacity;
rb->offset = 0;
rb->size = 0;
}
return rb;
}