上下文
我有一些函数可以支持在库中使用自定义内存分配器:
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(类型)
和
alignof(类型)
,还执行指向给定类型的指针的强制转换,以便编译器在将其用作其他类型时发出警告。
问题
deallocate
没有返回值,所以我们可以将其实现为带有变量的块,以执行隐式指针强制转换。但对于一个函数
做
返回一个值,也许
reallocate
,我们不能以相同的方式对传递给宏的指针进行类型检查。
有没有任何方法可以在表达式内部内联执行这种“类型检查”隐式强制转换,以便宏可以有结果?
编辑:如果可能的话,我想坚持使用没有任何GNU或其他扩展的标准C。