每创建一个对象,会在内存里复制一份实例(对象的)方法吗?

2016-03-23 17:19:34 +08:00
 UtopiaCHN

我的理解正确吗:实例的方法放在类对象里,每当实例要调用实例方法时,就去类对象的内存里调用。

2227 次点击
所在节点    程序员
8 条回复
neoblackcap
2016-03-23 17:24:30 +08:00
看情况,实践证明, Python 的实例方法不是,都是一个。
UtopiaCHN
2016-03-23 17:27:26 +08:00
@neoblackcap 我意思也是一个,你是怎么证明都是一个的
zwl2012
2016-03-23 19:41:08 +08:00
通过指针?
domty
2016-03-23 19:45:29 +08:00
Java 好像是有专门的一个地方叫方法区去存这些方法的。
还有类和对象应该是两个概念吧。类对象是指什么。

还有一点你说的东西应该是涉及到程序语言的内存模型,不同的程序语言应该会有不同。比如 JavaScript 中函数本身也是一个对象。
billlee
2016-03-23 20:35:20 +08:00
C++ 里方法放在代码段,每当要调用非虚函数时时,编译器把代码段里的地址填到调用处;调用虚函数时,先查虚函数表,虚函数表里是对应的实现函数在代码段里的地址(即函数指针)。

@domty 有些动态语言,类也是类似对象的,比如 python 的类就可以赋值给变量,然后那个变量就可以当类用了
alexapollo
2016-03-23 21:18:07 +08:00
大部分语言实现是不会复制的
neoblackcap
2016-03-23 22:10:05 +08:00
@UtopiaCHN
```
# coding=utf-8


if __name__ == '__main__':
class Animal(object):
def bark(self):
pass

dog = Animal()
wolf = Animal()
if id(dog.bark) == id(wolf.bark):
print('Different method of instance from same class are same')
else:
print('Different method of instance from same class are different')
```
gamexg
2016-03-24 08:45:20 +08:00
即使很特殊的情况也只是复制一个函数指针,没有碰到会复制代码的情况。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/265802

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX