每个对象中都有成员函数的一个拷贝吗?

SmallBoat2000 2009-12-10 11:03:55
比如一个类:
class A{
int n;
void fun();
}

A a;
对象a中含有(int n)的一份拷贝,而fun()函数是A的所有对象共有的吗?还是单独有一份拷贝的?
...全文
459 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
gelu1040 2009-12-15
  • 打赏
  • 举报
回复
两个地方兵法运行同一个函数,这个函数内部的变量和形参都是独立的,所以没问题.
只是,函数参数是引用或者指针传入的时候,如果引用的地方一样,或者指针指的是同一块内存,才会有冲突.
另外,如果函数体内有静态变量,也要小心冲突(用词是小心,不是一定),不过有时就是利用这个特性进行两个实例的对话
keeya0416 2009-12-11
  • 打赏
  • 举报
回复 1
成员变量是每个对象有一个,方法是所有的对象共用一个.
gamedragon 2009-12-11
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 dolphin_001 的回复:]
你误解他的意思了,他的意思是每次调用都要重新压栈,确实如此,只要用到局部变量,函数参数,都会分配最新的栈空间给这些变量,而不管你调用的到底是哪一个函数
[/Quote]
每个线程都有自己的栈,线程建立的时候栈就分配好了,函数调用的时候参数和局部变量无所谓分不分配的问题,只是移动一下栈指针而已,函数的代码只是根据栈指针取数据。A线程调用printf和B线程调用printf,要打印的东西完全不同,哪有“拷贝”的概念。
SmallBoat2000 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 gamedragon 的回复:]
同时使用一个函数怎么可能有冲突问题(如果函数是线程无关的)?LZ仔细考虑一下程序的执行过程就知道了。
如果有冲突,那么多程序同时用Windows API,Windows不是要冲突死了。
[/Quote]
忘了说,是多核情况下使用多线程?那情况会怎样呢?会不会发生冲突或者效率低下啊?
gamedragon 2009-12-10
  • 打赏
  • 举报
回复
同时使用一个函数怎么可能有冲突问题(如果函数是线程无关的)?LZ仔细考虑一下程序的执行过程就知道了。
如果有冲突,那么多程序同时用Windows API,Windows不是要冲突死了。
Dolphin_001 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 gamedragon 的回复:]
引用 7 楼 smallboat2000 的回复:
我暂时的理解是函数是用栈实现的,虽然类中的函数是共用的,但是每次调用函数都要压栈,并不是在原来的函数存储空间执行的,所以也就相对于每调用一次都拷贝了一份。不知这样理解对不?

不对。
函数只是一段代码在CPU上执行,用到的数据(函数的参数和局部变量)都在栈里,不同的线程有不同的栈,虽然使用的是同一个函数,但是函数所操作的数据是完全不同的数据。代码和数据没有绑定的关系,跟多少个核也没有关系,不知道你为什么会有“拷贝”这种想法。
[/Quote]
你误解他的意思了,他的意思是每次调用都要重新压栈,确实如此,只要用到局部变量,函数参数,都会分配最新的栈空间给这些变量,而不管你调用的到底是哪一个函数
SmallBoat2000 2009-12-10
  • 打赏
  • 举报
回复
如果是共用的,多线程编程的时候,多个对象都同时使用一个函数,会不会发生冲突或者效率低下啊?
阿杰心路历程 2009-12-10
  • 打赏
  • 举报
回复
在fun()方法里a还是用全局的a 单独的,没拷贝。
gamedragon 2009-12-10
  • 打赏
  • 举报
回复
当然是公用的。

成员函数和普通函数不同的地方就在于一个隐式的this指针。
gamedragon 2009-12-10
  • 打赏
  • 举报
回复
举个不恰当的例子,国家制定了法律,大家都要遵守法律,法律约束每一个人,那是不是说每个人都有个法律的拷贝呢?
gamedragon 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 smallboat2000 的回复:]
我暂时的理解是函数是用栈实现的,虽然类中的函数是共用的,但是每次调用函数都要压栈,并不是在原来的函数存储空间执行的,所以也就相对于每调用一次都拷贝了一份。不知这样理解对不?
[/Quote]
不对。
函数只是一段代码在CPU上执行,用到的数据(函数的参数和局部变量)都在栈里,不同的线程有不同的栈,虽然使用的是同一个函数,但是函数所操作的数据是完全不同的数据。代码和数据没有绑定的关系,跟多少个核也没有关系,不知道你为什么会有“拷贝”这种想法。
gamedragon 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 smallboat2000 的回复:]
忘了说,是多核情况下使用多线程?那情况会怎样呢?会不会发生冲突或者效率低下啊?
[/Quote]
Windows一样用得到多核。
SmallBoat2000 2009-12-10
  • 打赏
  • 举报
回复
我暂时的理解是函数是用栈实现的,虽然类中的函数是共用的,但是每次调用函数都要压栈,并不是在原来的函数存储空间执行的,所以也就相对于每调用一次都拷贝了一份。不知这样理解对不?
Dolphin_001 2009-12-10
  • 打赏
  • 举报
回复
成员函数都是放在静态存储空间里的。只有虚函数比较特别,会有一个虚函数表来指向所有的虚函数。
使用多线程,对于同一类的不同对象,调用同一个方法,局部变量是无关痛痒的,类成员变量是放在对象里面的,所以他并不会影响到多线程的共享变量,多核也不会影响了。

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧