V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
UtopiaCHN
V2EX  ›  程序员

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

  •  
  •   UtopiaCHN · 2016-03-23 17:19:34 +08:00 · 2228 次点击
    这是一个创建于 3167 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    @domty 有些动态语言,类也是类似对象的,比如 python 的类就可以赋值给变量,然后那个变量就可以当类用了
    alexapollo
        6
    alexapollo  
       2016-03-23 21:18:07 +08:00
    大部分语言实现是不会复制的
    neoblackcap
        7
    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
        8
    gamexg  
       2016-03-24 08:45:20 +08:00
    即使很特殊的情况也只是复制一个函数指针,没有碰到会复制代码的情况。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2870 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 14:16 · PVG 22:16 · LAX 06:16 · JFK 09:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.