【问题标题】:Is there a way to tell C to never allocate memory dynamically?有没有办法告诉 C 永远不要动态分配内存?
【发布时间】:2013-12-06 07:13:48
【问题描述】:

我想编写一个内存不变的 C 程序。它永远不能分配超过一定数量的内存。

int main(){
   int memory[512];
   int i = 5;
   i = i + 5;
   memory[50] = i;
};

请注意,在此示例中 i = 5i = i+5 将分配内存。我想完全避免内部内存分配过程(我认为这有点慢)。'有没有办法告诉 C 直接在我的内存数组上分配它?

【问题讨论】:

  • 这里没有堆分配。只是堆栈分配。
  • 不调用malloc()可以避免堆分配。可以避免堆栈分配... - 错误...它们无法避免。甚至int main(){} 也有堆栈分配。
  • 如果你调用任何库函数,它们可能在内部使用malloc()。您无法采取任何措施来防止这种情况发生。
  • 另外,你为什么要这样做?是为了表演吗?堆栈分配已经是最快的了。堆分配可能很慢。
  • “我认为这有点慢” - 你绝对没有任何权利去假设这个和那个。如果您推断出,通过适当地对代码进行基准测试,堆分配会导致主要瓶颈,只有这样您才能继续尝试重写它以减少(或可能没有)堆分配。但同样,这需要大量的测试和测量。 请不要进行可怕的过早优化。

标签: c memory-management


【解决方案1】:
int memory[512];    int i = 5;

通过这样做,您已经分配了内存。即使在 100 之后不填充元素,变量内存仍然会分配 512 个整数,变量 i 会分配 1 个整数。

如果您需要动态许可,可以查看malloc() or calloc()

【讨论】:

  • 你可以通过不声明变量来避免它。
  • 这种方式只会导致疯狂和痛苦。另外,这有过早优化的味道。我几乎可以向您保证,动态内存分配不会影响您程序的性能。
  • 堆栈变量的分配/解除分配在函数开头只是ESP -= 2048,所以基本上是免费的。
【解决方案2】:

你应该把"which I believe is kind of slow"改成"I am certain that it will not affect program speed"

【讨论】:

    【解决方案3】:

    首先,本地(“堆栈”)变量的“分配”非常快,通常发生在编译时,当函数的堆栈框架被布局时。每个变量在运行时没有开销,只是它不是这样工作的。

    其次,如果您想避免像int i; 这样的变量占用更多的堆栈空间,那么您必须避免在代码中使用该声明。

    你可以使用你分配的“块”,但这会很痛苦:

    int space[512];
    
    space[0] = 5;
    space[0] += 5;
    space[50] = space[0];
    

    上面复制了您对i 的使用,而是在数组中手动​​“分配”space[0]。当然,上面的代码很可能会产生比简单的 i 更糟糕的代码,这一切都是为了节省 int 的堆栈空间。

    【讨论】:

      【解决方案4】:

      仅使用全局声明的变量。

      但是,由于其他明显原因,这是一个不好的建议:https://stackoverflow.com/a/176166/694576

      【讨论】:

        【解决方案5】:

        int i = 5;i = i + 5; 的可能分配成本为零。方法中的单个 int 变量没有任何可观的分配成本。编译器在这里有几个选项:

        1. 它将尽可能在编译时进行算术运算并完全消除变量 (memory[50] = 10;),这意味着在运行时分配和算术都没有成本。

          李>
        2. 它会尽可能将变量放入 CPU 寄存器中(零分配成本,但仍需要时间进行算术运算)。

        3. 否则,它将为堆栈上的变量保留空间,这包括将堆栈指针递减513*sizeof(int) 字节而不是512*sizeof(int) 字节。它仍然不会花费额外的时间。操作系统可能不得不为线程堆栈获取额外的内存页面,但这或多或少是一次性成本。

        【讨论】:

          猜你喜欢
          • 2013-07-15
          • 2011-11-18
          • 2013-03-07
          • 1970-01-01
          • 2012-04-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-10
          相关资源
          最近更新 更多