我的目标是制作一个通用的Arena分配器,在可执行文件的.bss
部分存储一个缓冲区,以避免在实际程序中进行任何分配,但是这在C语言中存在严格别名的问题.如果我将缓冲区定义为static char buffer[BUFFER_SIZE];
,那么通过严格的别名,我不能使用指向它的另一种类型的指针而不会导致未定义的行为.因为我希望这个分配器是泛型的,所以我需要能够在其中分配任何类型.
我不能使用memcpy()
,因为分配器需要返回一个可以以任何方式使用的指针,而不是值的副本.我也不能使用基于union的类型双关,因为如果我没有弄错的话,它不会通过指针工作(参见第二个代码块here).
我知道在C中解决这个问题的唯一方法是使用-fno-strict-aliasing
标志完全禁用严格别名.在this blog post中,作者试图做同样的事情,但他得到的解决方案是使用内联汇编来"清洗"指针,这样优化器就不能应用严格的别名优化,但这似乎非常脆弱.
有没有更好的方法来做这样的事情?理想情况下,应该有一个内置的,它允许清楚地标记要被严格别名忽略的类型转换或内存区域.