LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1004|回复: 12

是编译器给函数分配空间?还是运行过程中申请空间?还是???

[复制链接]
发表于 2007-1-2 16:08:19 | 显示全部楼层 |阅读模式
随便举个例子:
class A
{
public:
        void get_XY()
               {cout<<"Enter two numbers of x, y:"
                 cin>>x>>y;
               };
private:
         int x, y;
}

请问,编译的时候,我估计编译器只会给x, y 变量分配空间,那么,void get_XY()函数呢?
不需要分配空间么?(可能只是几条命令的空间)

还有,程序运行的时候,get_XY()函数的空间大小?
发表于 2007-1-2 18:25:10 | 显示全部楼层
类不被实例化的话是不会占用空间的吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-2 18:28:58 | 显示全部楼层
那么就实例化一个对象吧,比如什么 A  a
回复 支持 反对

使用道具 举报

发表于 2007-1-2 22:21:47 | 显示全部楼层
当然函数在实例化对象时,是要分配空间的。
至于占用多大的空间,不同的编译器可能产生的也不同。
对于上面的例子,至少有函数的首部,即: PUSH %ebp MOVL %esp, %ebp
函数的尾部:MOVL %ebp, %esp POP %ebp RET
还用函数的实现部分:call 。。。
可以通过gcc -S xx.c 产生.s汇编文件,自己查看即可。注意编译后的函数名字要改变。
回复 支持 反对

使用道具 举报

发表于 2007-1-2 22:50:44 | 显示全部楼层
程序应该是在运行时装入内存,然后有操作系统分配空间的吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-3 10:56:42 | 显示全部楼层
我估计函数编译后就变成一些指令集罢了,指令占用的空间就是函数的大小,至于数据,是在实例化对象时分配空间
回复 支持 反对

使用道具 举报

发表于 2007-1-3 16:41:17 | 显示全部楼层
函数哪有不分配空间的, 没有见到的唯一解释是: 该函数在程序中没有被引用, 被编译器优化掉了
回复 支持 反对

使用道具 举报

发表于 2007-1-3 16:43:17 | 显示全部楼层
Post by DoDo
类不被实例化的话是不会占用空间的吧


Not really, try this:

  1. class C{
  2. public:
  3.   void f(){}
  4. };

  5. main(){
  6.   printf("0x%x\n",&C::f);
  7. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-3 17:49:42 | 显示全部楼层
我先猜后试,我估计是输出 f() 函数的地址
回复 支持 反对

使用道具 举报

发表于 2007-1-4 18:59:40 | 显示全部楼层
Post by rickxbx
Not really, try this:

  1. class C{
  2. public:
  3.   void f(){}
  4. };

  5. main(){
  6.   printf("0x%x\n",&C::f);
  7. }
复制代码

我指的当然是属性了,这是针对楼主的那个猜测而说的。
函数哪有不分配空间的,这只要看看 gcc -S 的结果也可以知道
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表