[GeekBand]C++高级编程技术(2)

本篇笔记主要分为两个主要部分,第一部分关于对象模型,第二部分是关于new和delete的更加深入的学习。

  1. 对象模型

  1. 关于vptr(虚指针)和vtbl(虚函数表)

    只要用到了虚函数,对象中就会多一个指向虚函数表的虚指针。在32位环境下,将占4Bytes的空间。

    在vtbl中,每一项都是指向自己类应当调用的虚函数的函数指针。

2.静态绑定与动态绑定

在C中,对于不同的函数名采用静态绑定的方法,每个函数直接对应了一个地址,存储在相应的位置中。在C++中,非虚的成员函数也用静态绑定的方式被存储。如上图中的A::func1()等成员函数。

不过对于虚函数,C++中采用了动态绑定的方法。在上图中,每个虚函数都存储在虚函数表中。当调用虚函数时,编译器会随着上图中的路径找到正确的函数调用。

由于动态绑定,不管什么地方调用虚函数,总能得到正确的结果这个机制限制了虚函数应该被虚函数覆盖。

虚函数可以由以下的两种方式得到。

一个非常常用的基于虚函数的方式是建立一个指向抽象类的指针链表,这是多态的体现。

关于类的对象模型的内存分配,涉及到对象的位对齐的规则,在博客中的另一篇文章中有简单介绍。

  1. 再谈new和delete

  • 定位new和delete运算符及其重载

    new和delete在使用时可以有一个可选的指针类型的参数,用来指定内存分配的起始地址。如果没有这一参数,则会在堆空间中自动分配一段合适大小的空间。

默认的一个定位new函数是:

void* operator new(size_t size,void *start)

在使用时可以采用例如如下的方法:int *p = new(0x12345678) int;

事实上,我们还可以使用别的参数列进行new操作,我们也可以对operator new和operator delete进行重载。例如下面的两个常用的参数列:

void* operator new(size_t size,long extra)//extra参数用于多申请一段存储空间,专门用来存储一些特别的信息,例如引用计数的信息。

void* operator new(size_t size,long extra,char init)

其固有的定义是:

inline void * operator new(size_t size){return malloc(size);}

inline void * operator new[](size_t size){return malloc(size);}//这里在调用时size会自动进行计算。

inline void operator delete(void * ptr,size_t size){free(ptr);}

inline void operator delete[](void * ptr,size_t size){free(ptr);}

注意,如果需要进行重载,第一个参数始终应该是size_t格式的。此外,通常情况下自己定义的delete不会被调用,而是继续采用默认的方法,直接释放内存。只有当new操作失败是,才会去寻找具有相同输入参数列的operator delete函数;如果没有定义相应的delete函数,也可以编译通过,就代表放弃处理new失败的这一异常。

时间: 2024-10-28 23:58:52

[GeekBand]C++高级编程技术(2)的相关文章

《好学的C++ 第2版》 第9章 一些高级编程技术

转向C++0x和OOP之前,需要掌握其他一些技巧. C++命令行参数: main函数须这样定义: int main(int argc, char* argv[]){/*...*/}  //argc计数包括程序名,所以至少是1:argv[0]就是程序名.这两个参数可以任意使用,但是是只读的,可以随意显示或复制它们.程序中可以通过argc判断输入参数是否足够(例如大于1),通过argv判断各参数是否合法,合法的话存入其他变量使用:不合法的话提示输入后,存入其他变量中使用即可.MAX_PATH:系统能

第三部分 F# 高级编程技术

在第二部分,我们讨论了大多数函数语言常见的函数概念.现在可以说已经理解了函数式编程,就像在阅读了封装.继承和多态性以后,可以说熟悉面向对象编程一样:但要想成为有效的面向对象的开发人员,还需要学习其他内容,用 F# 进行函数编程也没有什么不同. 就像每种面向对象语言的功能各有特色一样,在 F# 中也有一些特有的功能,在其他函数语言中通常没有,当我们在第九章讨论有关对象的类型和成员时,会看到这方面的示例.在 .NET 世界中,F# 是一等公民(first-class citizen),能够使用和声明

C#高级编程技术复习一

从基本的Socket编程进入 (注意:这是转的一篇2011年的文章,有些知识可能该更新了!) 这一篇文章,我将图文并茂地介绍Socket编程的基础知识,我相信,如果你按照步骤做完实验,一定可以对Socket编程有更好地理解. 本文源代码,可以通过这里下载 http://files.cnblogs.com/chenxizhang/SocketWorkshop.rar 第一步:创建解决方案 第二步:创建服务端程序 这里可以选择“Console Application”这个类型,比较方便调试 然后编写

【高级编程技术作业】第三周

5-2 5-6 5-8 5-9 5-11 6-1 6-5 6-9 原文地址:https://www.cnblogs.com/dhlee/p/python.html

【高级编程技术作业】第四周

7-1 7-2 7-3 7-6 7-7 8-1 8-2 8-5 原文地址:https://www.cnblogs.com/dhlee/p/8723688.html

【高级编程技术作业】第六周

11-1 11-2 11-3 原文地址:https://www.cnblogs.com/dhlee/p/8805933.html

【高级编程技术作业】第五周

9-1 9-2 9-3 9-5 9-7 10-3 10-4 10-5 10-6 10-7 原文地址:https://www.cnblogs.com/dhlee/p/8830554.html

Android开发经典书籍下载——《Android 4高级编程》《疯狂Android讲义》《Android应用开发详解(郭宏志)》《Android应用案例开发大全》《Android 3D游戏开发技术》

这是我收集的关于android开发方面的经典书籍,高清PDF电子版,可以在我的百度网盘免费下载,希望对需要的朋友有帮助. 目录: <Android 4高级编程>(附完整源代码) <疯狂Android讲义> <Android应用开发详解(郭宏志)> <Android应用案例开发大全> <Android 3D游戏开发技术> <Android内核剖析 柯元旦> <深入理解Android  卷1> <深入理解Android

Linux C高级编程——网络编程基础(1)

Linux高级编程--BSD socket的网络编程 宗旨:技术的学习是有限的,分享的精神是无限的. 一网络通信基础 TCP/IP协议簇基础:之所以称TCP/IP是一个协议簇,是由于TCP/IP包括TCP .IP.UDP.ICMP等多种协议.下图是OSI模型与TCP/IP模型的对照.TCP/IP将网络划分为4层模型:应用层.传输层.网络层和网络接口层(有些书籍将其分为5层,即网络接口层由链路层和物理层组成) (1)网络接口层:模型的基层.负责数据帧的发送已接收(帧是独立的网络信息传输单元).网络