2

如果您通读 GNU libs 文档,您可以看到:

一些非 GNU 系统不支持 alloca,因此它的可移植性较差。然而,用 C 语言编写的 alloca 的较慢仿真可用于具有此缺陷的系统。

假设 VLA 也不可用, C 仿真alloca()会是什么样子?

4

2 回答 2

1

根据是alloca()什么

alloca() 函数在调用者的堆栈帧中分配 size 个字节的空间。当调用 alloca() 的函数返回给它的调用者时,这个临时空间会自动释放。

实现将是特定于平台的,并且可能编译器应该意识到这一点,因为生成的代码必须尊重堆栈帧处局部变量的非固定偏移量。因此,如果您的工具链没有 VLA - 您与它无关。

于 2016-07-28T09:42:09.493 回答
0

由于您正在查看GNU libc 文档,您可能会考虑如何在 GCC 中进行模拟。

GCC 提供了cleanup允许在变量超出范围时调用清理函数的属性。

void foo (void *p) {
    printf("foo: %p\n", p);
}

int main(void) {
    int x __attribute__((cleanup(foo)));
    x = 7;
    printf("%p\n", &x);
    return 0;
}

在上述程序中,当x超出范围时,foo()将传递x.

于 2016-07-28T10:07:10.980 回答