请问下“类”放在内存中哪个存储区?

srxumin 2016-06-09 11:37:20
注意:不是用类定义的对象
我知道定义对象之后是放在堆区或者栈区的,但是“类”本身是不是和函数一起被载入到代码区去了?
...全文
1243 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
nanjun520 2016-06-14
  • 打赏
  • 举报
回复
受教了,我来看各位 牛人的回复的
cxyOOOO 2016-06-13
  • 打赏
  • 举报
回复
类如果有自己的属性,也可以在内存中。 像这样: struct A { static int i; };
赵4老师 2016-06-12
  • 打赏
  • 举报
回复
《深度探索C++对象模型》 《C++反汇编与逆向分析技术揭秘》
brookmill 2016-06-10
  • 打赏
  • 举报
回复
成员变量放在堆、或栈、或全局区,成员函数放在代码区。就是这些,没有其他的了
brookmill 2016-06-10
  • 打赏
  • 举报
回复
“类本身”这种东西是不会保存在内存里的。他的作用就是告诉编译器如何生成代码,编译完了就没用了。就像其他简单的类型int或者结构体,也是一样的。
brookmill 2016-06-10
  • 打赏
  • 举报
回复
引用 3 楼 srxumin 的回复:
struct A { int i; int j; }; void main() { } 那我把问题简化成结构体。假设编译器不进行优化,这段代码在编译以后struct A中的所有代码是不是先翻译成某些汇编指令被编译进exe文件中去了?
如果有两个函数: void f1() { struct A a1; struct A a2; a1.i = 1; a1.j = 2; a2.i = 3; a2.j = 4; } void f2() { int i1, j1; int i2, j2; i1 = 1; j1 = 2; i2 = 3; j2 = 4; } 这两个函数编译出来的汇编代码,有可能就是一样的。
brookmill 2016-06-10
  • 打赏
  • 举报
回复 2
所有的c或c++程序都是要编译成汇编代码的,汇编里怎么可能有类或者结构体的概念。类和结构体的作用是方便程序员写程序,编译之后就没用了。不管是成员变量、结构体变量还是普通变量,在汇编里都一样,只不过是一个内存地址而已。
lm_whales 2016-06-10
  • 打赏
  • 举报
回复
C++有虚函数,或者虚继承的类,
根据需要可以保存一些运行时信息在目标文件中

类中函数最终生成代码块(内联函数),
或者函数(跟C中的函数差不多,除了名字改编,。。。)

有虚函数的会生成虚函数表(看是不是需要,如果没有生成这个类的对象,可能也不生成虚函数表)
查找虚函数的虚函数表的指针,会嵌入对象内部

因此,类本身,大体上说,并不存在与目标代码中
但根据需要,可能会有一点 运行时信息,保留在目标代码中
然而,C++ “类本身” 的痕迹很浅,说他不存在,也不算错
小灸舞 2016-06-10
  • 打赏
  • 举报
回复
单从C++的角度来看,类只是一种抽象的描述,对象(实例)才是一种具体的东西,因此,描述是不占用任何空间的,对象才占。
从编译器的角度来看,这种“描述”有没有必要写进程序里面(这样就会导致占或不占用空间),这就看各家怎么实现编译器了。
1.光声明一个类,而不产生类的实例,即使这个类里面定义了N多函数,这些函数是不会出现在程序里的,也就是不占用内存,一旦声明定义的类,产生了类的实例,那么这些函数就会被编译进入程序里面
这个是C++预处理器的功劳,因为程序不用这个类,把它放到程序里面去,没有用处,除了占用空间

2.另外,类必须有描述它的信息,这些信息是不占用内存的,即使这个类有实例在程序,C++程序运行的时候不需要这些,C++不是Java,类的描述信息,程序编译的时候只要其语意,用来控制对象的内存布局这些,程序运行时,不需要这些(举个例子来说,private型变量,只是编译的时候在语意级别检测类外面的程序不能直接访问它,程序运行的时候,你可以在对象外面改它,因此没有必要保存类的描述信息到程序中)
  • 打赏
  • 举报
回复
引用 3 楼 srxumin 的回复:
struct A { int i; int j; }; void main() { } 那我把问题简化成结构体。假设编译器不进行优化,这段代码在编译以后struct A中的所有代码是不是先翻译成某些汇编指令被编译进exe文件中去了?
这个问题我也想知道,如果是动态链接库的话,肯定主函数只给一个调用接口,但是如果没有定义对象的类或者结构体会不会也成为二进制代码进入最后的可执行文件呢?
srxumin 2016-06-10
  • 打赏
  • 举报
回复
struct A { int i; int j; }; void main() { } 那我把问题简化成结构体。假设编译器不进行优化,这段代码在编译以后struct A中的所有代码是不是先翻译成某些汇编指令被编译进exe文件中去了?
paschen 版主 2016-06-10
  • 打赏
  • 举报
回复
编译链接之后 生成的二进制文件中已经不存在类的概念了,如果用到类中的成员函数等,则算是在代码区吧

64,642

社区成员

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

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