Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中模拟'alloca()_C_Alloca - Fatal编程技术网

在C中模拟'alloca()

在C中模拟'alloca(),c,alloca,C,Alloca,如果您通读GNU libs文档,您可以看到: 一些非GNU系统无法支持alloca,因此它的可移植性较差。 但是,对于其他应用程序,用C编写的alloca模拟速度较慢 在有此缺陷的系统上使用 假设VLA也不可用,alloca()的C模拟会是什么样子?根据alloca()是什么 函数的作用是:在堆栈中分配大小字节的空间 调用方的帧。此临时空间将自动释放 调用alloca()的函数返回其调用方时 实现将是特定于平台的,而且编译器可能应该知道这一点,因为生成的代码必须考虑堆栈帧处局部变量的非固定偏移量

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

一些非GNU系统无法支持alloca,因此它的可移植性较差。 但是,对于其他应用程序,用C编写的alloca模拟速度较慢 在有此缺陷的系统上使用


假设VLA也不可用,
alloca()
的C模拟会是什么样子?

根据
alloca()
是什么

函数的作用是:在堆栈中分配大小字节的空间 调用方的帧。此临时空间将自动释放 调用alloca()的函数返回其调用方时

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

自从您查看之后,您可能会考虑这将如何在GCC中模拟。

GCC提供了
cleanup
属性,允许在变量超出范围时调用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>代码>超出范围时, Foe[f]/代码>通过了 x的地址。C++中的

比较容易,但我怀疑你是否能在标准C中编写一个便携的<代码> ALOLACA</代码>函数?你能不能给我一个提示,你可以在C++中使用C++?@ USE1095108,你可以使用STD::SyrdypTR,我想。@ WalHAMTUTLand是的,如果你想从堆中分配。仿真只需要尊重全局接口,我意思是当从当前函数返回时自动释放分配的Bloc。本地对象的析构函数可以做到这一点,像
shared\u ptr
uniq\u ptr
这样的智能指针可以自动完成。这很有趣,但不是很有用,因为gcc将alloca作为内置项提供。@n.m.不总是这样。我的意思是,GCC并不总是为
alloca
生成内联代码。这就是GNU libc提供模拟实现的原因。
头文件说:
\ifdef\uuu GNUC\u35; define alloca\uu内置alloca
。它可能会也可能不会导致代码内联。glibc可能由gcc以外的编译器编译。@n.m.如果未包含
alloca.h
,则如果标志导致gcc不内联
alloca()
alloca
需要在典型实现上操纵堆栈指针,则链接器将选择仿真。您不能仅仅从链接器调用函数,所涉及的编译器必须提供一些支持(至少它不能对堆栈上的对象分配重新排序,等等)。此外,与自动变量相比,所分配对象的生存期也有所不同。