BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #71849同步于 2013/6/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

C++结构和类定义编译后会存放在代码区还是不存在?

never115
2013/6/17镜像同步18 回复
C++自定义结构和类编译时将成员函数转化为非成员函数放置到代码区,而类定义自身编译后仅包含非静态成员变量,创建类的实例的时候必须先见到类定义。 想请教下大牛, 1、一般编译器实现上,C++类定义编译后放置在哪里?编译后又以何种形态存在?是放在代码区,还是以其他形式存在,还是编译完就不存在了? 2、对于sizeof获取结构或类大小,是在编译时确定的,如果类定义编译完就不存在了,实际上也是不会有影响的吧? 3、同理,RTTI里面存储的,类名和函数名等信息,编译完后存放何处?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
king468546机器人#1 · 2013/6/17
不懂帮顶 【 在 never115 的大作中提到: 】 : C++自定义结构和类编译时将成员函数转化为非成员函数放置到代码区,而类定义自身编译后仅包含非静态成员变量,创建类的实例的时候必须先见到类定义。 : 想请教下大牛, : 1、一般编译器实现上,C++类定义编译后放置在哪里?编译后又以何种形态存在?是放在代码区,还是以其他形式存在,还是编译完就不存在了? : ...................
tonyjansan机器人#2 · 2013/6/18
// #include <cstdio> using namespace std; class A{ public: A() {} static void sub_s() { A::s = 0; } void sub_a() { a = 0; } private: static int s; int a; }; int A::s = 0; int main() { A a; // A* a = new A(); printf("%u", sizeof(A)); A::sub_s(); a.sub_a(); return 0; } 1.类对象如果是A a; 则存储空间在栈上~如果是A* a = new A();则存储空间在堆上 2.逆向出来的代码段如下: mov [esp+20h+var_1C], 4 ; sizeof(A) mov [esp+20h+var_20], offset aU ; "%u" call printf ; call printf 可以看到~编译器维护着常量表,将sizeof(A)的值直接mov进了栈中 3. RTTI也类似,由编译器来维护常量表~不过与sizeof略有不同~不是直接体现在代码段,而是由数据(rdata)区段维护~ 【 在 never115 的大作中提到: 】 : C++自定义结构和类编译时将成员函数转化为非成员函数放置到代码区,而类定义自身编译后仅包含非静态成员变量,创建类的实例的时候必须先见到类定义。 : 想请教下大牛, : 1、一般编译器实现上,C++类定义编译后放置在哪里?编译后又以何种形态存在?是放在代码区,还是以其他形式存在,还是编译完就不存在了? : ...................
never115机器人#3 · 2013/6/18
额,我问的不是A a;或者A* a = new A;这种; 我是说A这个类本身存放在哪里。。。 是说 class A{ public: A() {} static void sub_s() { A::s = 0; } void sub_a() { a = 0; } private: static int s; int a; }; 这一段内容,存放在哪里。。。 【 在 tonyjansan 的大作中提到: 】 : [code=c] : // : #include <cstdio> : ...................
tonyjansan机器人#4 · 2013/6/18
类本身是不存在的!这就是C++的弊病!虽然号称可以接近底层开发~其实类、模板一类的东西对于指令来说太过遥远了~处理器是不懂他们的~ 因此就需要编译器来做转化~编译器在编译的时候会将类的结构进行拆分的~ 对于函数来说无论是否是静态没有太大的区别~都是经过编译器编译后放在text段~只不过成员函数是把自身指针作为隐含参数传入(一般在代码上都是直接通过寄存器保留) 静态成员变量是作为全局参量由bss段维护~ 成员变量则是在类对象定义时分配的空间内的~ 【 在 never115 的大作中提到: 】 : 额,我问的不是A a;或者A* a = new A;这种; : 我是说A这个类本身存放在哪里。。。 : 是说 : ...................
nuanyangyang机器人#5 · 2013/6/18
真的!哪里都没有! 机器里没有类,在机器的层面,只能通过类的对象在内存里的存储形态,以及对这个类的对象的操作,来“感受”到这个类的存在。 不过,RTTI(Run-time type information)确实存在某个地方(参考<typeinfo>)。不过这都是元数据而已,不是类本身。 【 在 never115 的大作中提到: 】 : 额,我问的不是A a;或者A* a = new A;这种; : 我是说A这个类本身存放在哪里。。。 : 是说 : ...................
jonnyyue机器人#6 · 2013/6/18
类只是一种面向对象的思想; 这不是C++的弊端,反而是优势,因为编译后的文件不需要保存这些类的定义的信息; sizeof是编译器确定的; RTTI是存放到rdata区段,虚表也是在这个区段,类的信息的结构的指针保存在虚表前的一个DWORD_PTR, 该结构保存判断类的继承关系,支持dynamic_cast; 经常看到网上的人评论说好的架构不需要使用dynamic_cast,个人感觉RTTI很累赘,如果在现有的架构下进行较小的改动,dynamic_cast很实用;
FaceBasin机器人#7 · 2013/6/18
楼主下个OD玩玩吧,一路F7啥都明白了。
dachao机器人#8 · 2013/6/19
过了编译阶段之后就全是指针和函数指针,不再有类的概念
never115机器人#9 · 2013/6/19
OD是啥?求链接 【 在 FaceBasin 的大作中提到: 】 : 楼主下个OD玩玩吧,一路F7啥都明白了。