2013年6月20日

摘要: 转自博客http://my.csdn.net/v_july_v虚函数是通过一张虚函数表来实现的。在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承、覆盖的问题。这样,在有虚函数的类的实例中这个表被分配在了这个实例的内存中,所以,当我们用父类的指针来操作一个子类的时候,这张虚函数表就显得由为重要了,它就像一个地图一样,指明了实际所应该调用的函数。C++的编译器应该是保证虚函数表的指针存在于对象实例中最前面的位置(这是为了保证取到虚函数表的有最高的性能——如果有多层继承或是多重继承的情况下)。这意味着我们通过对象实例的地址得到这张虚函数表,然后就可以遍历其中函数指针,并调用相应的函数。一般 阅读全文
posted @ 2013-06-20 23:15 在路上的探索者 阅读(127) 评论(0) 推荐(0)
摘要: 1. 没有虚拟函数的情况1)在没有虚拟函数的情况下。对象的内存布局比较简单,就是按成员变量的定义顺序来安排成员变量在对象内存中的位置。2)成员函数的地址并不在对象的内存空间的,它和其它类外的函数一样,编译器会安排它们到某个内存空间。同样,使用一些“手段”你也可以获取成员函数的地址。class A{ int a; double b; void fun();};其实成员函数被单独分开来了,写成了这种形式void fun(A this)。函数还加一个this指针,指向调用这个函数的类对象,这个指针变量就加在形参表里,所以不用每个对象都保存成员函数。3)第一、结构或者类中的静态成员不对结构或者类的大小 阅读全文
posted @ 2013-06-20 23:14 在路上的探索者 阅读(200) 评论(0) 推荐(0)
摘要: 一、sizeof(结构体)Win32平台下的微软C编译器的对齐策略:1)结构体变量的首地址是最宽基本类型成员大小的整数倍;备注:编译器在给结构体开辟空间时,首先找到结构体中最宽的基本数据类型,然后寻找内存地址能被该基本数据类型所整除的位置,作为结构体的首地址。将这个最宽的基本数据类型的大小作为上面介绍的对齐模数。2)结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;备注:为结构体的一个成员开辟空间之前,编译器首先检查预开辟空间的首地址相对于结构体首地址的偏移是否是本成员的整数倍,若是,则存放本成员,反之,则在本成员和上一个成员之间填充一定的字 阅读全文
posted @ 2013-06-20 23:12 在路上的探索者 阅读(319) 评论(0) 推荐(0)
摘要: 1. inline函数的引入目的是解决使用宏定义的一些缺点。2. 宏定义的缺点:1)只做一些简单的字符替换,不能进行参数有效性的检测。2)另外它的返回值不能被强制转换为可转换的合适类型,3)C++中引入了类及类的访问控制,在涉及到类的保护成员和私有成员就不能用宏定义来操作。3. inline的优点1)没有调用的开销。 因为inline函数代码是被放到符号表中,使用时像宏一样展开;2)进行数据类型检查。因为inline函数是真正的函数;3)可以使用类的保护成员及私有成员。因为inline函数可以作为类的成员函数。4. inline函数使用的场合1)使用宏定义的地方都可以使用inline函数;2) 阅读全文
posted @ 2013-06-20 23:11 在路上的探索者 阅读(821) 评论(0) 推荐(0)

导航