类定义编译后究竟放置在哪里?

xingfeng2510 2011-11-17 09:19:43
编译原理学的不太好,仅知道c++自定义类编译时将成员函数转化为非成员函数放置到代码区,而类定义自身编译后仅包含非静态成员变量,创建类的实例的时候必须先见到类定义。疑惑之处是c++类定义编译后放置在哪里?编译后又以何种形态存在?是放置在符号表中吗?还是放在代码区,还是以其他形式存在?希望csdn达人们能够解析地详细一些。
...全文
415 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
benpaodeCjiajia 2011-11-26
  • 打赏
  • 举报
回复
//---引用:
这个有几种情况
1.类中变量成员还是类的函数
变量当然放在数据区,函数会放在代码区
静态的变量会放在静态数据区
2.类的定义是静态的,全程的还是自动的
静态的,全程的会放在CONST区(当然,不同编译器它会有不同的名字)
自动的在栈上
3.类的定义是指针,是动态申请的
它会在堆上
//----当然,我也是随便这么一说,真正要了解它的实际位置,看下它生成的汇编就OK了
其实,研究它也没多大意义

我该怎么去查看它的内存的情况,和编译后生成的汇编代码呢
benpaodeCjiajia 2011-11-26
  • 打赏
  • 举报
回复
请问我去哪找它编译过的汇编代码呢?
xingfeng2510 2011-11-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 keiy 的回复:]

引用 3 楼 xingfeng2510 的回复:
你说得是类实例的内存分布情况,我想了解的是类定义本身编译后以何种形态存在。

类定义本身只是一种类型定义,如果没有实例,多数情况它会被编译器优化而产生任何代码
参见以下代码:
C/C++ code

#include <iostream>
using namespace std;
class T {
int x;
public……
[/Quote]
基本上明白啦,多谢。
yisikaipu 2011-11-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yby4769250 的回复:]我觉得类的定义根本没有存储,存起来有何用?类定义只生存在编译期间,而存储起来的,应该是在运行期才有效的数据,但是,又有个RTT,我也困惑。我觉得,类定义只产生了词法分析、语法分析所需要的符号,类型以及大小,之后,类定义已经没有任何用处了[/Quote]

就是这样了

编译完后,类就完全化解为数据和函数了,与没有类的程序没啥实质差别

需要运行时类型识别时,无非是针对具体的类定义,自动增加了相应的代码,以支持在运行时获取类型信息,用于诸如比较两个对象的类型是否相等,唯一需要存储下来的是类的名字,所以它会被保存在 .data 区
柯本 2011-11-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xingfeng2510 的回复:]
你说得是类实例的内存分布情况,我想了解的是类定义本身编译后以何种形态存在。
[/Quote]
类定义本身只是一种类型定义,如果没有实例,多数情况它会被编译器优化而产生任何代码
参见以下代码:

#include <iostream>
using namespace std;
class T {
int x;
public:
void test() {
cout << "class test" << endl;
}
};
int main()
{
cout << "test" <<endl;
}

编译(CB2010)完成后的生成的汇编中(代码太长,就不贴了)根本就没的类T的实现,也找不到"class test"字串
即使你定义了全程的
T t1;
因为程序中没用到,所以同样也会被优化,不会产生代码
所以"类定义本身编译后以何种形态存在",只有在有实例应用的情况下,可以通过汇编来查看分析
以下面程序为例:

#include <iostream>
using namespace std;
class T {
int x;
public:
T(int x) { this->x=x; }
void test() {
cout << x << endl;
}
};
int main()
{
T t1(10),t2(20);
t1.test();
t2.test();
}

汇编如下:

; int main()
;
push ebp
mov ebp,esp
add esp,-8
;
; {
; T t1(10),t2(20);
;
@1:
mov dword ptr [ebp-4],10 //因为是inline函数,所以构造直接优化为变量赋值,这个是t1.x
mov dword ptr [ebp-8],20 //这个是t2.x
;
; t1.test(); //这个也是inline函数,所以是直接调用cout << t1.x << endl; 也就是cout << 10 << endl; 下面的t2同理
;
push dword ptr [ebp-4] //这个是t1.x 也就是10
push offset @std@cout
call @@std@%basic_ostream$c19std@%char_traits$c%%@$blsh$qi
add esp,8
push eax
call @@std@%endl$c19std@%char_traits$c%%$qr42std@%basic_ostream$c19std@%char_traits$c%%$r42std@%basic_ostream$c19std@%char_traits$c%%
pop ecx
;
; t2.test();
;
push dword ptr [ebp-8] //这个是t1.x 也就是20
push offset @std@cout
call @@std@%basic_ostream$c19std@%char_traits$c%%@$blsh$qi
add esp,8
push eax
call @@std@%endl$c19std@%char_traits$c%%$qr42std@%basic_ostream$c19std@%char_traits$c%%$r42std@%basic_ostream$c19std@%char_traits$c%%
pop ecx
xor eax,eax
;
; }
;

至于非类inline函数,它会生成一段代码在code段
所以我在#1说过:
真正要了解它的实际位置,看下它生成的汇编就OK了
当然,理论的东西我了解不多,我关心的是实际应用
yby4769250 2011-11-18
  • 打赏
  • 举报
回复
我觉得类的定义根本没有存储,存起来有何用?类定义只生存在编译期间,而存储起来的,应该是在运行期才有效的数据,但是,又有个RTT,我也困惑。我觉得,类定义只产生了词法分析、语法分析所需要的符号,类型以及大小,之后,类定义已经没有任何用处了
xingfeng2510 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 healer_kx 的回复:]

可以简单看看编译原理,和C++对象模型这写书,特别是后者。
[/Quote]
这两本书我都看过,后者似乎没有提及这方面的内容。
xingfeng2510 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 keiy 的回复:]

这个有几种情况
1.类中变量成员还是类的函数
变量当然放在数据区,函数会放在代码区
静态的变量会放在静态数据区
2.类的定义是静态的,全程的还是自动的
静态的,全程的会放在CONST区(当然,不同编译器它会有不同的名字)
自动的在栈上
3.类的定义是指针,是动态申请的
它会在堆上
当然,我也是随便这么一说,真正要了解它的实际位置,看下它生成的汇编就OK了
……
[/Quote]
你说得是类实例的内存分布情况,我想了解的是类定义本身编译后以何种形态存在。
xingfeng2510 2011-11-18
  • 打赏
  • 举报
回复
这个问题我发帖问过两次,还没人从正面给出一个合理的解释,或是主观猜测或是认为这个问题毫无意义。坐待高手解疑.
xingfeng2510 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 icechenbing 的回复:]

编译后不就成了01二进制代码?运行时候才加载分配的吧?
[/Quote]
编译后的所有东西都是二进制代码,我想了解的是类定义编译后的二进制代码如何存放。
qq120848369 2011-11-18
  • 打赏
  • 举报
回复
没意义,简单去网上看一下就行了,值得你关注的不是这些.
恨天低 2011-11-18
  • 打赏
  • 举报
回复
编译后不就成了01二进制代码?运行时候才加载分配的吧?
zzcmx2008 2011-11-18
  • 打赏
  • 举报
回复
代码区,应该
healer_kx 2011-11-17
  • 打赏
  • 举报
回复
可以简单看看编译原理,和C++对象模型这写书,特别是后者。
柯本 2011-11-17
  • 打赏
  • 举报
回复
这个有几种情况
1.类中变量成员还是类的函数
变量当然放在数据区,函数会放在代码区
静态的变量会放在静态数据区
2.类的定义是静态的,全程的还是自动的
静态的,全程的会放在CONST区(当然,不同编译器它会有不同的名字)
自动的在栈上
3.类的定义是指针,是动态申请的
它会在堆上
当然,我也是随便这么一说,真正要了解它的实际位置,看下它生成的汇编就OK了
其实,研究它也没多大意义

64,654

社区成员

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

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