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

C++语言 码拜 9年前 (2016-04-15) 1681次浏览
注意:不是用类定义的对象
本人知道定义对象之后是放在堆区或栈区的,但是“类”本身是不是和函数一起被载入到代码区去了?
解决方案

5

“类本身”这种东西是不会保存在内存里的。他的作用就是告诉编译器怎么样生成代码,编译完了就没用了。就像其他简单的类型int或结构体,也是一样的。

1

引用:

struct A
{
int i;
int j;
};
void main()
{
}
那本人把问题简化成结构体。假设编译器不进行优化,这段代码在编译以后struct A中的全部代码是不是先翻译成某些汇编指令被编译进exe文件中去了?

这个问题本人也想知道,假如是动态链接库的话,肯定主函数只给一个调用接口,但是假如没有定义对象的类或结构体会不会也成为二进制代码进入最后的可执行文件呢?

10

单从C++的角度来看,类只是一种抽象的描述,对象(实例)才是一种具体的东西,因此,描述是不占用任何空间的,对象才占。
从编译器的角度来看,这种“描述”有没有必要写进程序里面(这样就会导致占或不占用空间),这就看各家怎么实现编译器了。
1.光声明一个类,而不产生类的实例,即使这个类里面定义了N多函数,这些函数是不会出现在程序里的,也就是不占用内存,一旦声明定义的类,产生了类的实例,那么这些函数就会被编译进入程序里面
这个是C++预处理器的功劳,原因是程序不用这个类,把它放到程序里面去,没有用处,除了占用空间
2.另外,类必须有描述它的信息,这些信息是不占用内存的,即使这个类有实例在程序,C++程序运行的时候不需要这些,C++不是Java,类的描述信息,程序编译的时候只要其语意,用来控制对象的内存布局这些,程序运行时,不需要这些(举个例子来说,private型变量,只是编译的时候在语意级别检测类外面的程序不能直接访问它,程序运行的时候,你可以在对象外面改它,因此没有必要保存类的描述信息到程序中)

5

C++有虚函数,或虚继承的类,
根据需要可以保存一些运行时信息在目标文件中
类中函数最终生成代码块(内联函数),
或函数(跟C中的函数差不多,除了名字改编,。)
有虚函数的会生成虚函数表(看是不是需要,假如没有生成这个类的对象,可能也不生成虚函数表)
查找虚函数的虚函数表的指针,会嵌入对象内部
因此,类本身,大体上说,并不存在与目标代码中
但根据需要,可能会有一点 运行时信息,保留在目标代码中
然而,C++ “类本身” 的痕迹很浅,说他不存在,也不算错

10

编译链接之后 生成的二进制文件中已经不存在类的概念了,假如用到类中的成员函数等,则算是在代码区吧

3

全部的c或c++程序都是要编译成汇编代码的,汇编里怎么可能有类或结构体的概念。类和结构体的作用是方便程序员写程序,编译之后就没用了。不管是成员变量、结构体变量还是普通变量,在汇编里都一样,只不过是一个内存地址而已。

5

引用:

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;
}
这两个函数编译出来的汇编代码,有可能就是一样的。

4

《深度探索C++对象模型》
《C++反汇编与逆向分析技术揭秘》

5

类假如有本人的属性,也可以在内存中。
像这样:
struct A
{
static int i;
};

2

受教了,本人来看各位 牛人的回复的

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明问一下下“类”放在内存中哪个存储区
喜欢 (0)
[1034331897@qq.com]
分享 (0)