首页
社区
课程
招聘
[讨论]C++的类到底有没占用内存空间
发表于: 2007-10-25 20:23 12995

[讨论]C++的类到底有没占用内存空间

2007-10-25 20:23
12995

近日小弟看了"逆向C++"(http://www.pediy.com/document/reverse/reverse_c%2B%2B.rar),留下一个疑惑:C++的类到底有没占用内存空间?
以前学C++的时候一直都认为:类是对象的模板,对象是类的实例。类是抽象的,不占用内存,而对象是具体的,占用储存空间(--谭浩强的教程)。而从“逆向c++"一文可以看到类这种高层次的东西在底层也是占用内存空间的,难道真的是我一直以来的理解错了?还是我对文章的理解有问题?
小弟不才,没学过编译原理,还请高手解答。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (29)
雪    币: 271
活跃值: (18)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
2
不占呀。。。只是标识符。。。说这边有一个类存在...声明之后才会开辟空间...很好理解的。。。
要是每弄个类,内存都要分配空间。。。内存起不是要很累。。。况且也没有那么大的空间就是。。。
原来 内存也会偷懒呀。。。。
2007-10-25 20:33
0
雪    币: 266
活跃值: (52)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
3
正巧,这几天,我也正在研究此文,里面哪有这种说法?

类只是一种模型,只有生成实例后才会分配内存空间 ... ...
2007-10-25 20:34
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
4
1.所有的函数都占空间
2.vftable占空间
3.对象占空间
4.RTTI信息占空间
5.什么不占空间?
2007-10-25 20:38
0
雪    币: 266
活跃值: (52)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
5
2007-10-25 20:51
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我就是按照版主大哥那样想才觉得类是占用内存空间的。
首先类包含了成员函数,成员函数属于类的一部分,即使不声名类的对象,这一部分也会存在。
其次,类必须有描述它的信息,不然的话,动态声明一个对象的时候这个对象根据什么建立起来呢。
2007-10-25 20:53
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
期待更清楚更明确的回答
2007-10-25 21:01
0
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
8
2007-10-25 21:17
0
雪    币: 1746
活跃值: (287)
能力值: (RANK:450 )
在线值:
发帖
回帖
粉丝
9
1.光声明一个类,而不产生类的实例,即使这个类里面定义了N多函数,这些函数是不会出现在程序里的,也就是不占用内存,一旦声明定义的类,产生了类的实例,那么这些函数就会被编译进入程序里面
这个是C++预处理器的功劳,因为程序不用这个类,把它放到程序里面去,没有用处,除了占用空间

2.另外,类必须有描述它的信息,这些信息是不占用内存的,即使这个类有实例在程序,C++程序运行的时候不需要这些,C++不是Java,类的描述信息,程序编译的时候只要其语意,用来控制对象的内存布局这些,程序运行时,不需要这些(举个例子来说,private型变量,只是编译的时候在语意级别检测类外面的程序不能直接访问它,程序运行的时候,你可以在对象外面改它,因此没有必要保存类的描述信息到程序中)
2007-10-25 21:59
0
雪    币: 266
活跃值: (52)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
10
有虚函数的类,即使此类当前没有实例,其虚函数表也会加载,也就是占用内存了
2007-10-25 22:19
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
个人觉得静态类会占内存吧??
2007-10-25 22:36
0
雪    币: 427
活跃值: (412)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
不占空间怎么可能存贮。无非方式不同,内存占有不同,这些空间编译器自然会优化
2007-10-25 23:19
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
这个得问编译器,跟语言没有关系,不同的编译器原理也不一样,有的占用有的不知道占不占用,delphi应该是占用的
2007-10-26 13:24
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
14
楼主理解力有些问题,不知道是不是形而上学的拥护者。
2007-10-26 15:11
0
雪    币: 299
活跃值: (25)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
15
上纲上线了!
2007-10-26 15:32
0
雪    币: 3246
活跃值: (374)
能力值: (RANK:20 )
在线值:
发帖
回帖
粉丝
16
把《深度探索C++面向对象模型》这本书读几遍,就清楚了

英文名是《Inside the C++ Object Model 》
2007-10-26 16:20
0
雪    币: 2943
活跃值: (1788)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
17
类不占空间,很多类呀,如WORD,DWORD,BOOL等等,
定义一个变量后,就为这个变量(所谓的实例啦)分配空间,用不用这个变量,都会给它预留空间的。
人---->只是一个概念,大家脑子里都明白,他有两只手,两只脚,站立行走,会用工具……

人 张三
这时就要为张三留下一张床让他睡,一个立脚之地让他站,还要为他分配一个老婆……
其实很好理解啦。
2007-10-26 18:35
0
雪    币: 1657
活跃值: (291)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
18
我想是占的。。。只是简单点说,自己加进去,自己释放出来!
2007-10-26 22:11
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
先看看再说。
2007-10-27 18:44
0
雪    币: 200
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
20
我想应该占吧  
  要不计算机怎么记住啊
2007-10-28 12:04
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
我觉得答案基本上就是linxer大哥所说那样了,但是我还是有点不明,如果一个类的定义单独放在一个文件里面去编译,那这个类还是会被编译成obj吧?程序若未声明类的实例就不会出现类的信息,那是否linker的功劳?
2007-10-28 18:39
0
雪    币: 80
活跃值: (14)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
22
谈谈我对类的看法。其实C++中的类从一个角度上讲是面向对象的基础,对另一个角度上讲,它只是改变了在C语言里相关函数与数据的组织方式。

一个类的成员函数,其实可以把它看成是一种模板,同一类的不同实例在调用相同的成员函数的时候,其底层实现,感觉就象在C语言中调用相同的函数但分配不同的参数一样。自然得到结果会不同。类本身只是一个概念,真正占空间的,我想只是每个实例的数据成员,而函数成员的代码空间应该是公用的,只是在调用的时候根据不同的实例给了不同的参数罢了。但虚拟函数除外,我想每个定义虚拟函数的实例的函数代码都会单独存放,因为每个都不一样。

我猜,每个实例其实在底层应该都表示为一个指针,这个指针向它自身的数据成员集,所以当用某个实例来调用函数,读取数据的时候,计算机可以根据这个指针进行微调,来定位到所要的数据位置。
2007-10-29 08:48
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
类 = 人
对象 = LZ.
人不占地球空间..
LZ占地球空间..
请结贴.谢谢!
2007-10-30 10:33
0
雪    币: 112
活跃值: (48)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
24
与编译器实现有关
2007-11-1 15:48
0
雪    币: 267
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
单从C++的角度来看,类只是一种抽象的描述,对象(实例)才是一种具体的东西,因此,描述是不占用任何空间的,对象才占。
从编译器的角度来看,这种“描述”有没有必要写进程序里面(这样就会导致占或不占用空间),这就看各家怎么实现编译器了。

因此,上面大家的讨论我觉得有人从C++来看,有人从具体的编译器来看,这就导致了大家意见的不能统一。
2007-11-2 09:40
0
游客
登录 | 注册 方可回帖
返回
//