返回信息流C++自定义结构和类编译时将成员函数转化为非成员函数放置到代码区,而类定义自身编译后仅包含非静态成员变量,创建类的实例的时候必须先见到类定义。
想请教下大牛,
1、一般编译器实现上,C++类定义编译后放置在哪里?编译后又以何种形态存在?是放在代码区,还是以其他形式存在,还是编译完就不存在了?
2、对于sizeof获取结构或类大小,是在编译时确定的,如果类定义编译完就不存在了,实际上也是不会有影响的吧?
3、同理,RTTI里面存储的,类名和函数名等信息,编译完后存放何处?
这是一条镜像帖。来源:北邮人论坛 / cpp / #71849同步于 2013/6/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
C++结构和类定义编译后会存放在代码区还是不存在?
never115
2013/6/17镜像同步18 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
不懂帮顶
【 在 never115 的大作中提到: 】
: C++自定义结构和类编译时将成员函数转化为非成员函数放置到代码区,而类定义自身编译后仅包含非静态成员变量,创建类的实例的时候必须先见到类定义。
: 想请教下大牛,
: 1、一般编译器实现上,C++类定义编译后放置在哪里?编译后又以何种形态存在?是放在代码区,还是以其他形式存在,还是编译完就不存在了?
: ...................
//
#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++类定义编译后放置在哪里?编译后又以何种形态存在?是放在代码区,还是以其他形式存在,还是编译完就不存在了?
: ...................
额,我问的不是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>
: ...................
类本身是不存在的!这就是C++的弊病!虽然号称可以接近底层开发~其实类、模板一类的东西对于指令来说太过遥远了~处理器是不懂他们的~
因此就需要编译器来做转化~编译器在编译的时候会将类的结构进行拆分的~
对于函数来说无论是否是静态没有太大的区别~都是经过编译器编译后放在text段~只不过成员函数是把自身指针作为隐含参数传入(一般在代码上都是直接通过寄存器保留)
静态成员变量是作为全局参量由bss段维护~
成员变量则是在类对象定义时分配的空间内的~
【 在 never115 的大作中提到: 】
: 额,我问的不是A a;或者A* a = new A;这种;
: 我是说A这个类本身存放在哪里。。。
: 是说
: ...................
真的!哪里都没有!
机器里没有类,在机器的层面,只能通过类的对象在内存里的存储形态,以及对这个类的对象的操作,来“感受”到这个类的存在。
不过,RTTI(Run-time type information)确实存在某个地方(参考<typeinfo>)。不过这都是元数据而已,不是类本身。
【 在 never115 的大作中提到: 】
: 额,我问的不是A a;或者A* a = new A;这种;
: 我是说A这个类本身存放在哪里。。。
: 是说
: ...................
类只是一种面向对象的思想;
这不是C++的弊端,反而是优势,因为编译后的文件不需要保存这些类的定义的信息;
sizeof是编译器确定的;
RTTI是存放到rdata区段,虚表也是在这个区段,类的信息的结构的指针保存在虚表前的一个DWORD_PTR,
该结构保存判断类的继承关系,支持dynamic_cast;
经常看到网上的人评论说好的架构不需要使用dynamic_cast,个人感觉RTTI很累赘,如果在现有的架构下进行较小的改动,dynamic_cast很实用;