4

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

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

4

4 回答 4

7

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

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

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

于 2012-11-21T03:40:48.003 回答
4

我认为这个关于功能足迹的指南就是你所说的。他们可能正在寻找“32/64 位(整数),因为它是一个指针”......

于 2012-11-21T03:45:59.210 回答
3

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

于 2012-11-21T03:53:50.443 回答
1

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

function func(){}

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

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

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

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

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

于 2012-11-21T06:05:18.373 回答