c++ - 非静态成员函数,为每个对象创建生成一份机器代码?

标签 c++

<分区>

在C++中,如果我定义如下函数

int func1(int a, int b){ 
  int res;
  // do some stuff for a, b, res;
  return res;
}

我知道 func1 的机器码只有一份拷贝如果它不是内联的,则由编译器生成(如果我错了请纠正我),并且在程序执行期间每次调用 func1将调用该机器代码拷贝。但是,对于类中的成员函数,如下所示

 class A{
 private:
    // some data members and member functions
 public: // or alternatively private: 
    int func2(int a, int b){ 
      int res;
      // do some stuff for a, b, res;
      return res;
    }
 }

我有以下问题:

  1. 如果我这样做sizeof(A) ,它只返回数据成员的大小(可能包括填充字节),然后在哪里 func2被储存了?是func2存储在与数据成员连续的一 block 内存中?如果不是,它不会惩罚缓存吗?
  2. 如果我声明std::vector<A> v(1000) , func2 会不会有1000份机器码生成?如果是,我认为与在类外声明函数(如 func1)相比,这将导致很大的内存浪费和性能劣势。 (如果我错了请纠正我)。

最佳答案

在 C++ 中,类成员函数的实现方式与常规 C 风格的函数基本相同。但是,它们有一个“ secret ”的第一个参数,即 this 指针,指向调用该方法的类的实例。因此,也只有一个实例化的类成员函数的拷贝。

(有一些关于多个编译单元和链接的潜在问题......但是由于您在问题中忽略了它们,为了方便起见,我们现在将继续忽略它们。)

如果你想自己看看,你可以把指向一个类的各个实例的成员函数的指针,比较它们是否相等。

关于c++ - 非静态成员函数,为每个对象创建生成一份机器代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32430499/

相关文章:

C++ 大于等于运算符

c++ - 子类非公开继承的虚函数会发生什么?

c++ - 函数可以正确编译,但不能编译为类的成员函数

Python C API - 重新加载模块

c++ - 如何使用 C++ 中的函数更新结构的值?

c++ - 如何在cocos2d(cocos2d-x)中制作流水效果

java - Android 如何确定将哪个缓冲区用于 logcat 消息?

c++ - _mm_cmpistri 反向

带指针的 C++ 模板 - 无法转换模板参数

c++ - 如何在 C++ 中的字符串中查找元音?