标签: alloca

为什么使用alloca()不被视为良好做法?

alloca()在堆栈上而不是在堆上分配内存,如同的情况一样malloc().所以,当我从例程返回时,内存被释放.所以,实际上这解决了我释放动态分配内存的问题.释放分配的内存malloc()是一个令人头痛的问题,如果不知何故错过会导致各种内存问题.

alloca()尽管有上述特征,为什么不鼓励使用?

c malloc stack allocation alloca

381
推荐指数
18
解决办法
12万
查看次数

alloca() 在内存级别如何工作?

我试图弄清楚alloca()在记忆层面上实际上是如何工作的。来自Linux 手册页

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

这是否意味着将按字节alloca()转发堆栈指针n?或者说新创建的内存到底分配在哪里?

这不是与可变长度数组完全相同吗?

我知道实现细节可能留给操作系统之类的东西。但我想知道一般来说这是如何实现的。

c alloca stack-frame variable-length-array

45
推荐指数
3
解决办法
4193
查看次数

alloc,malloc和alloca - 有什么区别?

我的印象是alloc在Objective-C中(当我们调用时[anyObject alloc]实际上是在实现C函数malloc并且内存在堆中分配,但找不到任何答案).

此外,在搜索时alloc,我发现了alloca哪些在堆栈中分配内存.如果我没有错,请alloc在堆中分配内存以创建对象.

那么allocmalloc(和alloca)之间有什么区别?任何人都可以总结一下吗?

c memory malloc memory-management alloca

19
推荐指数
1
解决办法
4万
查看次数

14
推荐指数
2
解决办法
3867
查看次数

在llvm代码中出现的%"alloca point"行的目的是什么?

我一直在看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)

llvm alloca

10
推荐指数
1
解决办法
1027
查看次数

是否有使用alloca的分配器,否则符合C++ STL?

我有两个问题:

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++ stack stl alloca allocator

10
推荐指数
1
解决办法
1592
查看次数

C中的alloca函数

我正在修改C并遇到了alloca/free函数,这些函数被描述为像空间一样在堆栈上分配存储.与malloc/free相同吗?或者这是不同的东西?谢谢.

c alloca

10
推荐指数
1
解决办法
9241
查看次数

alloca完全可以替换吗?

我已经阅读了很多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 arrays alloca

8
推荐指数
1
解决办法
2230
查看次数

alloca的函数范围中的goto是否有效?

C标准禁止转入存在VLA的功能范围.

VLA和对alloca函数的调用应该在低级别上具有相同的结果.

(我可能是错的,因为我只是一个C,而不是一个低级程序员,但在我的想象中,似乎很机智)

那么下面的代码片段也会是未定义的行为吗?

int main()
{
    char *p;

    goto label1;

    {
        p = _alloca(1);
label1:
        p = NULL;
    }
}
Run Code Online (Sandbox Code Playgroud)

当然我不能参考p,但是关于这种行为是什么?

c c99 alloca undefined-behavior

8
推荐指数
1
解决办法
207
查看次数

在C中隐藏结构定义是一个好习惯吗?

我认为隐藏结构定义会使代码更安全,因为您在编译器的帮助下强制执行,不能直接访问结构的任何成员.缺点是用户无法在堆栈上声明结构类型的变量,因为结构的大小未知,有时需要避免使用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()是能够在堆栈上声明结构但隐藏其定义.

c struct memory-management alloca

8
推荐指数
1
解决办法
133
查看次数