【问题标题】:Where is memory allocated for member function when we create an object of a class in C++? [duplicate]当我们在 C++ 中创建类的对象时,为成员函数分配的内存在哪里? [复制]
【发布时间】:2018-06-21 10:21:00
【问题描述】:

我只是想知道当我们在 C++ 中创建一个具有 100 个数据成员和 10000 个成员函数的特定类的对象时,内存是如何分配的。

每次创建对象时,我们都会为数据成员和成员函数分配内存,还是只为数据成员创建内存?

假设我有一堂课:

class A {
   int a,b,c,d,e; // ...many more variables;
   // ........
   // ........
   // 100 more variables
public:
    int getID(){ return a; }
    int perFormSomething(){ return  b; }
    // ..............
    // ..............
    // 1000 more functions;  
};

int main() {
    A *a = new A[10000]; // array of objects of A
    return 0;
}                     

如果成员函数也获取内存,那么我认为这会给操作系统带来巨大的内存负担?

【问题讨论】:

标签: c++ class memory


【解决方案1】:

在程序执行之前,指令需要加载到内存中,但是由于每个成员函数的代码在实例之间是共享的,所以没有per-instance分配。

使用成员变量会发生相反的情况,它们需要按实例加载,因为每个实例对这些变量都有自己的值。因此,当在执行期间创建一个新实例时,它会被分配到内存中。

【讨论】:

  • 感谢@alseether 的解释,但我想知道函数定义的实际存储位置?
  • @ChandraShekharRam 那你应该这么说。在你的问题中。你没有。
  • 函数在编译时被转换成汇编代码。它们不需要真正的存储,因为它们就是代码。它可以看作是存储在代码本身中。当您在代码中调用函数时,编译器会为该代码部分创建一个jump 指令,其中放置函数代码
  • @alseether 真是一大堆华夫饼。当然,他们需要“内存空间”和“存储空间”。他们不需要的是per-instance 存储,因为它们不会因实例而异。
  • @EJP 是的。在执行程序之前,需要将指令加载到内存中。我对这个问题的理解更像是 创建对象时会发生什么? 在执行期间。对不起,如果我错了。
猜你喜欢
  • 1970-01-01
  • 2012-06-11
  • 2021-04-30
  • 1970-01-01
  • 2013-10-05
  • 2019-09-26
  • 1970-01-01
  • 1970-01-01
  • 2018-11-04
相关资源
最近更新 更多