alloca(n)和char x 之间有什么区别?
有什么区别
void *bytes = alloca(size);
和
char bytes[size]; //Or to be more precise, char x[size]; void *bytes = x;
…其中size是一个在编译时值未知的变量。
alloca()
在当前函数结束之前不回收内存,而可变长度数组在当前块结束时回收内存。
换一种方式:
void foo() { size_t size = 42; if (size) { void *bytes1 = alloca(size); char bytes2[size]; } // bytes2 is deallocated here }; //bytes1 is deallocated here
可以在任何C89编译器上支持(以某种方式) alloca()
,而可变长度数组需要C99编译器。
从GNU文档 :
分配有alloca的空间一直存在,直到包含函数返回。 一旦数组名称的范围结束,就会释放可变长度数组的空间 。 (如果在同一个函数中同时使用可变长度数组和alloca,则可变长度数组的释放也将释放最近使用alloca分配的任何内容。)
此外, alloca
不是标准的C函数,因此不能保证所有编译器都支持。 可变长度数组是C99标准的一部分,因此任何支持C99的编译器都应该实现它。
除了Billy提到的那点, alloca
是非标准的(它甚至不在C99中)。
在第二种forms中, size
必须是编译时已知的常量。
除了已经讨论的关于何时释放空间的点,以及构造是否得到支持,还有以下几点:
- 在
alloca
情况下,bytes
具有指针类型。 - 在
[]
情况下,bytes
具有数组类型。
最明显的区别在于sizeof(bytes)
是多少; 对于指针,它是指针的大小( sizeof(void *)
),而对于数组,它是分配空间的大小( sizeof(char) * size
,其中= size
,因为sizeof(char)
= 1 )。
(另外,在您的示例中,元素类型不同;要相同,第一个应更改为char *bytes = alloca(size)
。)
最大的区别在于,当您将内存用作类变量时,alloca不会调用构造函数或析构函数。
其他差异不太可能被注意到,但在某些情况下可能会出现一些奇怪的运行时错误。