C++成员函数和成员变量存储说明

成员函数和成员变量存储说明

C++中类的成员函数和成员变量的存储方式是不一样的。比如定义对象是系统会为对象分配存储空间,其中只为成员变量分配了存储空间,而成员函数则存放在公共的代码段中。如下图所示:

在这里插入图片描述

因此可以看出,每个对象占用的存储空间只是该对象的数据部分(虚函数指针和虚基类指针也属于数据部分)所占用的存储空间,而不包括成员函数所占用的存储。

测试代码

代码如下,以下代码的输出结果是什么?

class Test
{
public:
	void function1()
	{
		cout<<"in func1"<<endl;
	}

	void function2()
	{
		cout<<"in func2"<<endl;
	}
};
int main()
{
	Test* t = NULL;
	t->function1();
	t->function2();

	return 0;
}

答案:输出 in func1后,程序崩溃
原因:function1是成员函数,存放在代码段(.text),所以没有实例化类的时候仍然可以调用。function2是虚函数,关系到虚函数表和虚函数指针,虚函数指针存放在实例化的对象中,所以,未实例化对象时,不存在虚函数指针,所以调用虚函数会报错

inline函数:需要说明,不论成员函数在类内定义还是在类外定义,成员函数的代码段都用同一种方式存储。不要将成员函数的这种存储方式和inline(内联)函数的概念混淆。不要误以为用inline声明(或默认为inline)的成员函数,其代码段占用对象的存储空间,而不用inline声明的成员函数,其代码段不占用对象的存储空间。不论是否用inline声明(或默认为inline),成员函数的代码段都不占用对象的存储空间。用inline声明的作用是在调用该函数时,将函数的代码段复制插人到函数调用点,而若不用inline声明,在调用该函数时,流程转去函数代码段的入口地址,在执行完该函数代码段后,流程返回函数调用点。inline与成员函数是否占用对象的存储空间无关,它们不属于同一个问題,不应搞混。


C++程序的存储分布

C++程序的内存格局通常分为四个区:全局数据区(data area),代码区(code area),栈区(stack area),堆区(heap area)(即自由存储区)。

  • 全局数据区存放全局变量,静态数据和常量;
  • 所有类成员函数和非成员函数代码存放在代码区;
  • 为运行函数而分配的局部变量、函数参数、返回数据、返回地址等存放在栈区;
  • 余下的空间都被称为堆区。
    由此,我们可以得知在类的定义时,类成员函数是被放在代码区,而类的静态成员变量在类定义时就已经在全局数据区分配了内存,因而它是属于类的。对于非静态成员变量,我们是在类的实例化过程中(构造对象)才在栈区或者堆区为其分配内存,是为每个对象生成一个拷贝,所以它是属于对象的。

类的静态成员函数和非静态成员函数的区别

静态成员函数和非静态成员函数都是在类的定义时放在内存的代码区的,因而可以说它们都是属于类的,但是类为什么只能直接调用静态类成员函数,而非静态类成员函数(即使函数没有参数)只有类对象才能调用呢?原因是类的非静态类成员函数其实都内含了一个指向类对象的指针型参数(即this指针),因而只有类对象才能调用(此时this指针有实值)上面的测试代码中this的值是NULL,NULL也是一个实值

猜你喜欢

转载自blog.csdn.net/tsh123321/article/details/88966421
今日推荐