使用 alloca 函数或 static 关键字将值放入堆栈

问题描述 投票:0回答:1

我有一个抽象的“x vs y”问题。在 C 编程语言中,如果我有一些少量的数据想要存储在 RAM 中的某个位置,我想典型的选项是下一个:

  • 定义一个变量,除非进行一些编译器优化,否则它将位于“慢”堆中;
  • 到“慢”堆中的一些空间并在这里写一些东西;
    定义静态变量,
  • malloc()
  • 关键字意味着与堆栈相关,这对我来说意味着“快”;
    使用 
  • static
  • 在“快速”堆栈中分配值。
    
    
  • 那么
alloca()

关键字和

static
非标准函数有什么区别?
    

c memory-management stack-memory
1个回答
0
投票

    通过定义变量,我假设您的意思是像
  1. alloca()

    那样声明它。其行为取决于此类声明出现的位置。

    我。如果它在函数内部,那就是我们所说的本地/自动
    多变的。这很可能会分配在堆栈上(如果是
    没有被编译器优化掉)。

    ii.如果它出现在文件范围内,那么它将是一个全局变量,很可能会在全局内存中分配。

    这些分配都不“慢”(如果将其与堆分配成本进行比较)

  2. 打电话给
  3. int x;

    。这总是在堆上分配内存并返回指向已分配内存的指针。根据您的定义方式,这可能会很慢,因为调用

    malloc
    会执行计算出堆上分配的空间的代码。以这种方式分配的内存必须通过在同一指针上调用
    malloc
    来释放。
    
    

  4. 使用
  5. free

    关键字。

    static
    与堆栈无关。当
    static
    出现在函数内部时,类似于将变量设为全局变量,并将驻留在全局内存中。在文件范围内使用
    static
    也会生成变量,但只能从同一个文件访问它(与全局变量相反,全局变量只要有声明就可以从其他文件访问)。
    
    

  6. 使用
  7. static

    。调用

    alloca
    与在 API 中调用
    alloca
    类似,但会在堆栈上为您分配空间。这个记忆永远不应该是手动的
    malloc
    'd。
    
    

  8. 您缺少的是问题的另一半,它决定了什么是适合您的选择,即这些对象的预期寿命。

© www.soinside.com 2019 - 2024. All rights reserved.