假设我们在堆栈中创建了一个类的实例.据我所知,编译器根据该实例中的字段类型和数量为其提供特定数量的内存.但我对实例方法感到困惑.我假设他们有自己的堆栈框架.
我不明白的是:
>实例方法的堆栈框架位于何处?它们是否位于实例堆栈框架内部或存储在其他位置?
>是否只为该类的许多实例创建了一个实例方法堆栈框架
>如果是这样,那么如果同一个类的两个对象同时从不同的线程调用相同的函数呢?
解决方法
与普通函数一样,C中的成员函数有多个内存块.首先,构成成员函数的实际汇编指令通常放在代码段中,不应该有任何问题.其次,每次调用该成员函数时,都会为该调用内的所有局部变量(“自动对象”)保留额外的堆栈空间,这些变量在调用返回时被清除.我应该特别指出函数没有一些固定的预分配内存用于它们的堆栈空间 – 如果一个函数是递归的,例如,你可能同时有多个堆栈帧对该函数有效.相反,根据需要存在尽可能多的堆栈帧.
在C中声明类类型的局部变量时,只能获取对象本身的内存.没有分配额外的内存来保存该对象的成员函数 – 如上所述,成员函数内存要么放在数据段中,要么在调用成员函数时根据需要进行分配.具体来说,如果在已声明的对象上调用成员函数,则程序将为该成员函数分配新的堆栈帧,调用该函数,并在函数返回时清理内存.成员职能没有额外的“溢价”;它们实际上并不影响对象的大小(尽管在您的类中有一个或多个虚函数可能会增加对象大小的一次性成本).
当然,这都是依赖于实现的;原则上的实现可以分配额外的空间来存储对象内的成员函数,但据我所知,没有标准的C实现可以做到这一点. (如果您知道vtable是什么,则该对象可能具有vtable指针,但不是所有vtable条目).
希望这可以帮助!