我的库中有一些函数支持使用自定义内存分配器:
void *(allocate)(struct allocator *allocator, size_t size, size_t alignment);
void (deallocate)(struct allocator *allocator, void *pointer, size_t size, size_t alignment);
这个界面有两点我仍然想改进:
sizeof(type)
和alignof(type)
。void *
允许错误地使用指向无效大小或对齐方式的类型的指针。这两个问题都可以通过一些简单的宏来修复:
#define allocate(allocator, type, count) \
(type *)(allocate)(allocator, sizeof(type) * (count), alignof(type))
#define deallocate(allocator, pointer, type, count) \
do { \
type *typed_pointer = pointer; \
(deallocate)(allocator, typed_pointer, sizeof(type) * (count), alignof(type)); \
} while (0)
该宏负责调用
sizeof(type)
和 alignof(type)
,并且还将指针强制转换为给定类型,以便编译器在将其用作不同类型时发出警告。
deallocate
没有返回值,因此我们可以将其实现为带有变量的块来执行隐式指针转换。但对于确实返回值的函数,也许是reallocate
,我们无法以相同的方式对传递给宏的指针进行类型检查。
有什么方法可以在表达式内部执行这种“类型检查”隐式强制转换,以便宏可以得到结果?
编辑:如果可能的话,我想坚持使用标准 C,而不使用任何 GNU 或其他扩展。
复合文字是可以赋值的对象,因此您可以将
(type *) {0} = (pointer)
写为 reallocate
的参数,编译器将执行通常的检查以检查指针类型的赋值。赋值表达式的值将是分配给复合文字的新值。