gpt4 book ai didi

c++ - 线程模型和类实例内存管理

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:05:32 25 4
gpt4 key购买 nike

假设我们在堆栈中创建了一个类的实例。我知道编译器会根据该实例中字段的类型和数量为其提供特定数量的内存。但是我对实例方法感到困惑。我假设他们有自己的堆栈框架。

我不明白的地方:

  1. 实例方法的栈帧在哪里?它们位于实例堆栈框架内还是存储在其他地方?
  2. 是否只为类的多个实例创建了一个实例方法栈帧
  3. 如果是这样,那么如果同一个类的两个对象同时从不同线程调用同一个函数怎么办?

最佳答案

与普通函数一样,C++ 中的成员函数也有多 block 内存。首先,是组成成员函数的实际汇编指令,它们通常放在代码段中,无需担心。其次,每次调用该成员函数时,都会为该调用内部的所有局部变量(“自动对象”)保留额外的堆栈空间,并在调用返回时清理这些空间。我应该特别指出,函数没有一些固定的预分配内存用于它们的堆栈空间——如果一个函数是递归的,例如,您可能同时为该函数激活多个堆栈帧。相反,有尽可能多的堆栈帧。

当你在C++中声明一个类类型的局部变量时,你得到的只是对象本身的内存。没有分配额外的内存来保存该对象的成员函数——如上所述,成员函数内存要么放在数据段中,要么在调用成员函数时根据需要分配。具体来说,如果您在已声明的对象上调用成员函数,则程序将为该成员函数分配一个新的堆栈帧,调用该函数,并在函数返回时清理内存。拥有成员(member)功能,无需额外支付“溢价”;它们实际上不会影响对象的大小(尽管在您的类中有一个或多个虚函数可能会增加对象大小的一次性成本)。

当然,这完全取决于实现; 原则上 的实现可以分配额外的空间来存储对象内部的成员函数,但据我所知,没有标准的 C++ 实现会这样做。 (如果你知道 vtable 是什么,对象可能有一个 vtable 指针,但不是所有的 vtable 条目)。

希望这对您有所帮助!

关于c++ - 线程模型和类实例内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24874528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com