在C中模拟'alloca()
如果您通读GNU libs文档,您可以看到: 一些非GNU系统无法支持alloca,因此它的可移植性较差。 但是,对于其他应用程序,用C编写的alloca模拟速度较慢 在有此缺陷的系统上使用在C中模拟'alloca(),c,alloca,C,Alloca,如果您通读GNU libs文档,您可以看到: 一些非GNU系统无法支持alloca,因此它的可移植性较差。 但是,对于其他应用程序,用C编写的alloca模拟速度较慢 在有此缺陷的系统上使用 假设VLA也不可用,alloca()的C模拟会是什么样子?根据alloca()是什么 函数的作用是:在堆栈中分配大小字节的空间 调用方的帧。此临时空间将自动释放 调用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>代码>超出范围时,
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
需要在典型实现上操纵堆栈指针,则链接器将选择仿真。您不能仅仅从链接器调用函数,所涉及的编译器必须提供一些支持(至少它不能对堆栈上的对象分配重新排序,等等)。此外,与自动变量相比,所分配对象的生存期也有所不同。