C中任意内存的类型

时间:2016-08-16 06:50:05

标签: c

这是参考这个问题

How to implement the c malloc/realloc functions properly?

接受的答案提到可以使用char数组来模拟任意内存池。

然而,接受回答的评论之一是

  

没有分配存储持续时间的char数组只能是   字符类型别名。换句话说,它不能也应该如此   不能用作任意记忆

这是对的吗?如果是这样,那么可以使用什么?我想避免使用alloc或任何特定的操作系统调用 - 所以我对这个问题是对称的。

2 个答案:

答案 0 :(得分:2)

周围有不同的问题。首先,如@Magisch answer所示,相关问题是返回悬空指针,导致未定义行为和一般执行错误。

第二个与@ ^ *#(此处审查)严格别名规则有关。当您使用字符数组作为大缓冲区来分配任何类型时,通用编译器会生成正确的代码,前提是您确保正确对齐。毕竟,这是他们实施mallocreallocfree例程的方式。并且由于它们是托管环境(C标准库)的一部分,因此编译器开发人员不足以使用它来进行fordib。

但是这里的C标准有点严格。你应该把我自己的答案here读给一个类似的问题,特别是@ EOF对它的评论:

  

您不能将声明为char []的对象的部分包含到其他类型的对象(字符类型除外)中,因为它们具有声明的类型...这意味着从技术上讲,您无法实现malloc()在纯C

答案 1 :(得分:1)

别名是指the strict aliasing rule,它控制允许编译器使用寄存器的方式。如果你有不同类型的指针指向相同的内存位置,那么在读取其他指针类型时可能不会注意到通过一种指针类型完成写入,因为允许编译器将数据缓存在寄存器中。

实现内存池时,这个问题通常没什么问题,因为池实现不会读/写内存。

如果你想要任意类型,那么最安全的赌注是工会。它不仅会“击败”严格的混叠规则,还会确保正确对齐。请记住,malloc和朋友确保对齐适合任何类型,而auto则不然。