alloca()在堆栈上而不是在堆上分配内存,如同的情况一样malloc().所以,当我从例程返回时,内存被释放.所以,实际上这解决了我释放动态分配内存的问题.释放分配的内存malloc()是一个令人头痛的问题,如果不知何故错过会导致各种内存问题.
alloca()尽管有上述特征,为什么不鼓励使用?
我试图弄清楚alloca()在记忆层面上实际上是如何工作的。来自Linux 手册页:
alloca() 函数在调用者的堆栈帧中分配 size 字节的空间。当调用 alloca() 的函数返回到其调用者时,该临时空间会自动释放。
这是否意味着将按字节alloca()转发堆栈指针n?或者说新创建的内存到底分配在哪里?
这不是与可变长度数组完全相同吗?
我知道实现细节可能留给操作系统之类的东西。但我想知道一般来说这是如何实现的。
我的印象是alloc在Objective-C中(当我们调用时[anyObject alloc]实际上是在实现C函数malloc并且内存在堆中分配,但找不到任何答案).
此外,在搜索时alloc,我发现了alloca哪些在堆栈中分配内存.如果我没有错,请alloc在堆中分配内存以创建对象.
那么alloc和malloc(和alloca)之间有什么区别?任何人都可以总结一下吗?
我一直在看llvm-gcc最近生成的一些LLVM程序集,我注意到一个反复出现的声明,我不确定它的用途.
例如,以下C程序:
int main(void)
{
void (*f)(void) = (0x21332);
f();
}
Run Code Online (Sandbox Code Playgroud)
使用"llvm-gcc -emit-llvm -S"编译时将生成以下代码(删除不相关的部分):
define i32 @main() nounwind {
entry:
%retval = alloca i32 ; <i32*> [#uses=1]
%f = alloca void ()* ; <void ()**> [#uses=2]
%"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0]
store void ()* inttoptr (i64 135986 to void ()*), void ()** %f, align 4
%0 = load void ()** %f, align 4 ; <void ()*> [#uses=1]
call void %0() nounwind
br label %return …Run Code Online (Sandbox Code Playgroud) 我有两个问题:
1)是否可以实现使用alloca在堆栈上分配内存的分配器,否则符合C++ STL?
如果那里有代码,只需将我指向URL即可让我高兴.:-)如果那里没有代码,也许你可以草拟函数allocate和deallocate?
2)如果对上述问题的回答为"是",我想了解如何为类成员在堆栈上分配内存.举个例子,考虑一下
std::vector<int, AllocaAllocator<int> >
Run Code Online (Sandbox Code Playgroud)
并且假设对该向量的成员函数'resize'的调用首先调用'deallocate'然后'分配'分配器.
调用allocate的范围是成员函数resize的范围.这是不是意味着在该函数调用结束时从堆栈中删除了已分配的内存?
亲切的问候,Bjoern
我正在修改C并遇到了alloca/free函数,这些函数被描述为像空间一样在堆栈上分配存储.与malloc/free相同吗?或者这是不同的东西?谢谢.
我已经阅读了很多alloca过时的地方,不应该使用,而应该使用可变长度数组.
我的问题是:alloca可变长度数组是否完全可以替换?
在我的特定实例中,我有一些看起来像这样的东西:
typedef struct {
int *value;
size_t size;
} some_type;
void SomeExternalFunction(some_type);
...
void foo(){
//What I thought to do
some_type bar;
bar.value=alloca(sizeof(int)*10);
SomeExternalFunction(bar);
//what should be done without alloca
some_type fizz;
int tmp[10];
fizz.value=tmp;
SoemExternalFunction(fizz);
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么或者这是对alloca的实际使用吗?另外假设这个例子由于某种原因我想要在堆栈上分配值
C标准禁止转入存在VLA的功能范围.
VLA和对alloca函数的调用应该在低级别上具有相同的结果.
(我可能是错的,因为我只是一个C,而不是一个低级程序员,但在我的想象中,似乎很机智)
那么下面的代码片段也会是未定义的行为吗?
int main()
{
char *p;
goto label1;
{
p = _alloca(1);
label1:
p = NULL;
}
}
Run Code Online (Sandbox Code Playgroud)
当然我不能参考p,但是关于这种行为是什么?
我认为隐藏结构定义会使代码更安全,因为您在编译器的帮助下强制执行,不能直接访问结构的任何成员.缺点是用户无法在堆栈上声明结构类型的变量,因为结构的大小未知,有时需要避免使用malloc().这可以(部分成功)解决,alloca(3)所有主要的libc实现都存在,尽管此函数不符合POSIX.鉴于这种优点和缺点,这样的设计一般可以认为好吗?
在lib.h:
struct foo;
extern size_t foo_size;
int foo_get_bar (struct foo *);
Run Code Online (Sandbox Code Playgroud)
在lib.c:
struct foo {
int bar;
};
size_t foo_size = sizeof foo;
int foo_get_bar (struct foo *foo)
{
return foo->bar;
}
Run Code Online (Sandbox Code Playgroud)
在example.c:
#include "lib.h"
int bar(void) {
struct foo *foo = alloca (foo_size);
foo_init (foo);
return foo_get_bar (foo);
}
Run Code Online (Sandbox Code Playgroud)
UPD:更新了问题,明确指出使用的思想alloca()是能够在堆栈上声明结构但隐藏其定义.