C++和python函数调用的区别与联系

"C++和python函数调用的区别与联系"

Posted by Simon on December 6, 2020

时隔两周,加入字节跳动后的第一篇技术博客

一般方法

类方法

目前对于类方法的调用,各个语言主要有两种方式

(这里所说的显示和隐式的主要是说对于类方法,this指针的声明方式)

C++的隐式调用

在C++中,使用操作符.或者->来访问一个类的成员变量或者成员方法。如:

class Foo{
  
public:
  static void bar(int val){}
  
  void func(int val){}

};

int main(){
  Foo::bar(1);
  Foo foo;
  foo.func(2);
  // auto foo = new Foo(3);
  // foo->func(4);
}

python的显示调用

class Foo{
  def func(self, val):
  	pass
  
  @classmethod
  def bar(cls, val):
  	pass
}

可见,相对于C++,python的每一个成员方法都显式的指明了selfcls 。但这只是声明方式的不同,其本质依然是一样的。

之所以这么说,是因为在计算机中,无论什么语言的函数的调用,其汇编代码大致都是一样的。比如上面例子中函数fun的调用,其汇编代码大概是:

func:
	pass

main:
	...
	mv val 1
	push val
	call func

简单的说是因为,汇编中函数的调用都是通过栈来传递参数,即便像C++这种所谓的隐式调用,依然少不了push this这个过程。即,你完全可以通过找到一个成员函数的地址,然后传递this指针和参数来调用该成员函数。比如fun地址为0xffff0381,则obj->func(1)等同于*0xffff0381(this, 1);