系统要为每个对象的函数都分配内存吗?

xlccf 2006-04-21 08:40:00
1.一个class 含有很多函数,但是实际只用了几个,没用到的函数系统还会为它们分配内存吗?
2.如果new 多个该class的对象,设为a b c ...,系统要分别为a b c ...中的函数分配内存吗?
...全文
209 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
navi_dx 2006-04-21
  • 打赏
  • 举报
回复
看看Stanley是怎么说的
One C++ design criterion is that a nonstatic member function at a minimum must be as efficient as its analogous nonmember function
This is achieved by internally transforming the member instance into the equivalent nonmember instance.
出于效率的考虑,编译器把成员函数转换成对等的非成员函数实体,也可以说,成员函数和普通函数是一回事,只是参数传递规则不同。
至于空间应该不会在调用的时候才分配,我编程这么久还没有遇到一般的调用函数时CALL指令不是采用立即寻址的,CALL指令当然也可以才用其他寻址方式,比如你通过函数指针访问函数,但是一般的函数调用都是立即寻址,如果你的空间不是先分配好,你立即寻址的地址从那里来?

以上是我个人的看法,欢迎大家讨论。
xlccf 2006-04-21
  • 打赏
  • 举报
回复
感谢楼上各位
Johnny_de 2006-04-21
  • 打赏
  • 举报
回复
同意楼上的说法,LZ可以看下编译原理,内存中有代码区和数据区分别存放编译后的代码和要分配的变量空间。

函数只有在被调用时才会从栈上分配空间。
navi_dx 2006-04-21
  • 打赏
  • 举报
回复
你试一下不就知道了,定义一个类,new两次,取两个实例的同一个函数地址,比较一下,我的结论是无论你生成多少个实例,同一个类的成员函数的空间只有一份,“对象的方法在没有调用前好象是不分配内存”我认为是错误的,这个空间在函数代码区,跟你是否实例化该对象毫无关系,就算你的对象方法的方法你一次也没有调用过,该对象方法也会分配空间。调用成员函数的时候系统把this指针传到ECX中,执行成员函数时,根据ECX的值访问对象的数据,所以一个多个实例对应一个成员函数空间,如果有两个实例同时访问一个成员函数空间,因为寄存器重命名技术,也不会互相有影响
逸学堂 2006-04-21
  • 打赏
  • 举报
回复
1.一个class 含有很多函数,但是实际只用了几个,没用到的函数系统还会为它们分配内存吗?
2.如果new 多个该class的对象,设为a b c ...,系统要分别为a b c ...中的函数分配内存吗?
~~~~~~~~~~~
简单的说,一个class无论有多少个对象,他的成员函数都会在代码区都是唯一,只有在调用此函数时,函数才会从栈上申请变量空间,进行函数操作。
所以函数本身只会在代码区分配唯一的内存。
sixsavage 2006-04-21
  • 打赏
  • 举报
回复
同一个进程的同一个类的所有对象都共享一份函数代码拷贝的。甚至子类继承父类的那些函数也是同父类共享的。
romanticlife 2006-04-21
  • 打赏
  • 举报
回复
关注:

理论上应该是不分配内存的。
shichengxi 2006-04-21
  • 打赏
  • 举报
回复
是有分配内存!
eplanet 2006-04-21
  • 打赏
  • 举报
回复
对象的方法在没有调用前好象是不分配内存的.
静态的方法是所有类对象公共的,即只有一份实例化的代码.
xlccf 2006-04-21
  • 打赏
  • 举报
回复
第二个问题明白了
第一个问题:那么第一次new一个class的对象,会为class的每个函数都分配内存吗?是不是在vc的release版本中不会将class中没用到的函数链接到exe文件中
老道_ 2006-04-21
  • 打赏
  • 举报
回复
1.好象不全是
2.好象是都分配???
iamcaicainiao 2006-04-21
  • 打赏
  • 举报
回复
赫赫,函数放在函数的代码区。所有对象公用该类的函数。
yuanchuang 2006-04-21
  • 打赏
  • 举报
回复
不会,全局函数也是这样……

如果用模板,也是用几个,实例话几个

其实这样你就会明白了:如果你声明了一个函数,但是并没有定义,但如果你没有用到他的话,并不会有错。

还有,兄弟,分多的话,多加点分……
Johnny_de 2006-04-21
  • 打赏
  • 举报
回复
干吗不给我分!

64,684

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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