alloca(0)在不同平台上做什么和返回什么?



如果给定的大小为0,alloca()是否返回NULL ?

快速搜索发现alloca(0)在某些情况下强制垃圾收集!但我最感兴趣的是返回值。

谢谢

gcc-2.95的alloca实现使用malloc本身从堆中分配内存。在该实现上下文中,alloca(0)相当于:free (/*all the memory that was allocated with alloca when the stack pointer was deaper*/)。这是gcc-2.95的allocal .c文件注释中的一段话。

这个实现的一般概念是保持跟踪所有本地分配的块,并回收任何块它们被发现在堆栈中比当前更深调用。这种启发式方法不会将存储回收为它很快就会失效,但最终还是会失效的。

作为一种特殊情况,alloca(0)回收存储分配任何。在中使用alloca(0)是个好主意你的主控制循环等来强制垃圾回收。

在这个实现中,alloca(0)返回NULL

根据这个手册,alloca将在堆栈上分配内存,它要么成功,要么使您的程序崩溃。

现在,对于一个0字节的分配,你不应该为返回值而烦恼:因为有0字节,没有空间给你写,无论返回的指针值是0x1234还是NULL,程序都应该崩溃。

在Windows上,_alloca(0);返回堆栈指针(带有一些固定偏移量)。在某些特殊情况下,当C代码需要从x64进程中知道RSP CPU寄存器时,这可能是必要的(因为Visual Studio中不支持64位构建的内联汇编)

请记住,调用_alloca(0);将在堆栈上分配一些内存,所以请确保不要在同一局部作用域中重复调用它,否则可能会耗尽堆栈并导致stack overflow异常。

作为一个更好的选择,可以考虑调用_AddressOfReturnAddress()为intrinsic。

根据Linux手册页

这个函数在POSIX.1-2001中没有。

指出

alloca()函数依赖于机器和编译器。

所以alloca()设置0大小的元素是不合法的,但是没有定义

我没有size=0时返回值的具体示例。请看看这个问题和"GNU版本说明"。第一个链接

相关内容

  • 没有找到相关文章

最新更新