【问题标题】:How much memory does a function use?一个函数使用多少内存?
【发布时间】:2013-11-19 09:32:14
【问题描述】:

我在一次采访中被问到这个问题——“一个函数使用多少内存?”。所以我试图回答说你可以把所有数据变量占用的所有内存、它实例化的数据结构加起来——例如,为 long 添加 4 个字节,为 char 添加 1 个字节,为 int 添加 4 个字节,为 32 位指针添加 32 位系统,并添加任何动态分配的输入。面试官对我的回答很不满意。

我正在学习 C++,如果有任何见解,我将不胜感激。

【问题讨论】:

  • 除了变量之外,堆栈上还有更多的分配。
  • 面试官本来可以更具体...

标签: c++ function memory-management


【解决方案1】:

问题是完全不确定的。函数本身将只占用调用者的activation record、参数和堆栈上的局部变量的空间。根据架构,激活记录将包含诸如保存的寄存器、调用函数时返回的地址等内容。

但是一个函数可以在堆上分配它需要多少内存,所以没有一个准确的答案。

另外,如果函数是递归的,那么它可能会使用大量内存,这总是因为每次调用之间都需要激活记录。

【讨论】:

    【解决方案2】:

    我认为guide on function footprints 就是您所说的。他们可能正在寻找“32/64 位(整数),因为它是一个指针”......

    【讨论】:

      【解决方案3】:

      从静态行为的角度来看, 1. 它使用的数据 - 所有变量内存大小的总和 2. 指令大小 - 写在函数内部的每条指令都会占用一些二进制内存。这就是你的函数的大小将如何被识别。这只不过是您编译的代码大小。 从动态行为(运行时)的角度来看, 1.函数调用产生的堆内存是函数内存。

      【讨论】:

        【解决方案4】:

        我敢打赌,正确的答案可能是“未定义”。一个空函数不消耗任何东西。

        function func(){}
        

        一个链接的需要比我们实际估计的要多。

        function funcA()
        {
           funcB();
           funcC();
           //...
        }
        

        在其范围内没有使用的本地对象将被大多数编译器优化掉,因此它在其容器中也占用零内存。

        function func()
        {
           var IamIgnored=0;
           //don't do anything with IamIgnored
        }
        

        请不要错过内存对齐,所以我认为计算对象或函数使用的内存不能简单地通过在其范围内累积所有对象的内存大小来完成。

        【讨论】:

          猜你喜欢
          • 2015-12-03
          • 2010-09-08
          • 2017-02-06
          • 1970-01-01
          • 2012-02-13
          • 2011-08-27
          • 2014-01-31
          • 2010-11-28
          • 1970-01-01
          相关资源
          最近更新 更多