C++函数内存占用

一个类的对象中是没有关于普通成员函数的指针的slot,只有成员变量还有虚表指针,类的成员函数的代码定义在PE文件的代码区,所以从程序加载时,就已经分配好了内存用于存放这些代码;代码运行时所需要的内存,比如栈、堆等等,则是代码运行时才分配的;对于某个类的所有对象来说,类成员函数只在内存中有一份拷贝,所有的对象都共享同一份成员函数的代码。同一个类的不同的对象之间的差异仅仅是通过成员变量来体现的。c++实现成员函数的时候实际上用到了一个技巧——this指针。this指针是当前调用成员函数的对象首地址,我们知道通过这个地址可以访问到对应对象的成员变量。那么成员函数如何区分this究竟指向哪个对象呢?技巧就在于,c++背后把成员函数当做普通函数一样调用,除了传入实际的参数外,还把所属对象的指针作为参数this传入,函数内部通过显示的或者隐含的方式访问对象成员。当然,这只是背后的事情,外面用起来就和你见到的一样,简单直观。

一个很诡异的例子可以证明类函数与类实例无关:

#include "stdafx.h"

class CTest {
public:
    void test() {
        printf("hello\n");
    }
};
int main()
{
    CTest* ptest = NULL;
    ptest->test();//输出 hello
    return 0;
}

 如果用C#实现类似这面的代码则运行不通,抛出了异常:

    class CTest
    {
        public void test()
        {
            Console.WriteLine("hello");
        }
    }
    static void Main()
    {
        CTest ot = null;
        ot.test(); //运行时将抛出异常
    }

 

posted @ 2016-11-04 10:57  时空观察者9号  阅读(357)  评论(0编辑  收藏  举报