- 浏览: 369988 次
- 性别:
- 来自: 苏州
文章分类
- 全部博客 (335)
- C++ (190)
- 设计模式 (43)
- 数据库技术 (5)
- 网络编程 (11)
- 自动化测试 (6)
- Linux (13)
- OpenSSL (10)
- MS Crypt API (5)
- SCM (2)
- English (4)
- Android (10)
- EMV规范 (1)
- Saturn Platform (0)
- C (10)
- SQL (2)
- ASP.NET (3)
- 英语口语学习 (3)
- 调试工具 (21)
- 编译技术 (5)
- UML (1)
- 项目管理 (5)
- 敏捷开发 (2)
- Http Server (6)
- 代码审查、代码分析 (5)
- 面试基础 (10)
- 重点知识 (16)
- STL (6)
- Efficient C++资料 (8)
- 数据结构和算法 (7)
- 读书笔记 (0)
- 开源项目 (4)
- 多线程 (2)
- Console App (6)
- 个人开源项目 (4)
- IBM DevelopWorks (4)
- Java (16)
- 内存泄漏相关调试和检测 (13)
- 软件测试相关技术 (2)
- C# (11)
- Apple Related (1)
- 软件测试和管理 (2)
- EMV (1)
- Python (1)
- Node.js (6)
- JavaScript (5)
- VUE (1)
- Frontend (1)
- Backend (4)
- RESTful API (3)
- Firebase (3)
最新评论
-
u013189503:
来个密码吧
[C++][Logging] 项目中写日志模块的实现 -
wyf_vc:
来个密码啊!!
[C++][Logging] 项目中写日志模块的实现
转自
http://blog.chinaunix.net/uid-25872711-id-3015683.html
虚函数
看如下例子:
ZooAnimal为动物园所有动物的基类,myType标明类型,如果要画出所有动物,可用如下方式实现:
但是这样的代码维护比较烦琐,当新增动物,或者去除动物的时候你需要不断的修改switch语句。这里可以使用虚函数处理,利用其动态绑定。
当类X中存在虚函数,那么编译器会为类X产生一个虚函数表,虚函数表拥有该类的所有虚函数的指针。每一个类有一个虚函数表,类的每个对象都有一个隐藏的指向该表的指针。隐藏是因为,只有编译器知道vptr在对象内部的偏移量。编译器在对象的构造函数中插入代码,以正确初始化vptr。
虚函数似乎有以下的几方面开销:
1) 必须在构造函数内初始化vptr
2) 虚函数是通过指针间接调用,必须先得到指向虚函数表的指针,然后访问正确的函数偏移量
3) 内联是编译时的选择,由于虚函数的类型判断发生在运行时,所以编译器不能内联虚函数。
公平的来讲,前两项并不算做性能损失。因为即使不使用虚函数,也需要付出类别的开销。初始vptr的开销等价于Bear中初始化类型的开销,如:
第二条函数调用的开销,等价于switch逻辑和区分不同类型Bear::Draw()的开销:
其实,虚函数真正的损失只有第三条,无法内联函数是虚函数最大的性能损失。
由于函数内联造成的性能损失没有固定的代价,如果是简短、调用频繁的函数那么性能损失就比较明显。可以用模板来解决这一问题。
模板和继承
看如下线程锁的示例代码,要实现不同线程锁类型CriticalSection和Mutex的线程安全string类:
按以下三种方法设计:
1)硬编码:从string类派生CirticalSectionString和MutexString,每个类包含特定的锁
2)虚函数:从string派生一个ThreadSafeString,包含Locker锁基类指针,通过虚函数加锁,开锁。
3)模板:创建一个Locker参数的模板字符串类
硬编码方式:
显然这种方式没有额外开销,不同锁机制实现不同的string类型,lock和unlock可以在编译时刻确定,进行内联。
虚函数:
通过虚函数动态绑定正确类型lock和unlock,代码较简单,但是虚函数不能内联,有性能损失。
模板:
模板可以很好的实现多态,也可以在编译时刻确定类型,因此lock和unlock可以内联,这样就没有不必要开销。
要点:
1)因为虚函数不能内联,这对调用频繁、简单的函数的性能开销影响较大。
2)如果设计可行,可以用模板,取代虚函数实现多态,减小性能损失。
http://blog.chinaunix.net/uid-25872711-id-3015683.html
Efficient C++ 第三章
虚函数
看如下例子:
class ZooAnimal { public: ... virtual void draw(); int resolveType() {return myType;} private: int myType; ... }
ZooAnimal为动物园所有动物的基类,myType标明类型,如果要画出所有动物,可用如下方式实现:
void drawAllAnimals (ZooAnimal *pz) // pointer to first animal in the // list { for (ZooAnimal *p=pz; p ;p = p->next) { switch (p->resolveType()) { case BEAR: ( (Bear *) p)->draw(); break; case MONKEY: ((Monkey *) p)->draw(); break; ... // Handle all other animals currently in the zoo. } } }
但是这样的代码维护比较烦琐,当新增动物,或者去除动物的时候你需要不断的修改switch语句。这里可以使用虚函数处理,利用其动态绑定。
void drawAllAnimals (ZooAnimal *pz) // pointer to first animal in the // list { for (ZooAnimal *p=pz; p ;p = p->next) { p->draw(); } }
当类X中存在虚函数,那么编译器会为类X产生一个虚函数表,虚函数表拥有该类的所有虚函数的指针。每一个类有一个虚函数表,类的每个对象都有一个隐藏的指向该表的指针。隐藏是因为,只有编译器知道vptr在对象内部的偏移量。编译器在对象的构造函数中插入代码,以正确初始化vptr。
虚函数似乎有以下的几方面开销:
1) 必须在构造函数内初始化vptr
2) 虚函数是通过指针间接调用,必须先得到指向虚函数表的指针,然后访问正确的函数偏移量
3) 内联是编译时的选择,由于虚函数的类型判断发生在运行时,所以编译器不能内联虚函数。
公平的来讲,前两项并不算做性能损失。因为即使不使用虚函数,也需要付出类别的开销。初始vptr的开销等价于Bear中初始化类型的开销,如:
class Bear : public ZooAnimal { ... Bear (const char *name) : myName(name), myType(BEAR) {} ... };
第二条函数调用的开销,等价于switch逻辑和区分不同类型Bear::Draw()的开销:
switch (p->resolveType()) { case BEAR: ( (Bear *) p)->draw(); break; case MONKEY: ((Monkey *) p)->draw(); break; ... // Handle all other animals currently in the zoo. }
其实,虚函数真正的损失只有第三条,无法内联函数是虚函数最大的性能损失。
由于函数内联造成的性能损失没有固定的代价,如果是简短、调用频繁的函数那么性能损失就比较明显。可以用模板来解决这一问题。
模板和继承
看如下线程锁的示例代码,要实现不同线程锁类型CriticalSection和Mutex的线程安全string类:
class Locker { public: Locker() {} virtual ~Locker() {} virtual void lock() = 0; virtual void unlock() = 0; };
按以下三种方法设计:
1)硬编码:从string类派生CirticalSectionString和MutexString,每个类包含特定的锁
2)虚函数:从string派生一个ThreadSafeString,包含Locker锁基类指针,通过虚函数加锁,开锁。
3)模板:创建一个Locker参数的模板字符串类
硬编码方式:
class CriticalSectionString : public string { public: ... int length(); private: CriticalSectionLock cs; }; int CriticalSectionString::length() { cs.lock() int len = string::length(); cs.unlock(); return len; }
显然这种方式没有额外开销,不同锁机制实现不同的string类型,lock和unlock可以在编译时刻确定,进行内联。
虚函数:
class ThreadSafeString : public string { public: ThreadSafeString (const char *s, Locker *lockPtr) : string(s), pLock(lockPtr) {} ... int length(); private: Locker *pLock; }; int ThreadSafeString::length() { pLock->lock(); int len = string::length(); pLock->unlock(); return len; } //使用时,如下: { CriticalSectionLock cs; ThreadSafeString csString("Hello", &cs); ... } { MutexLock mtx; ThreadSafeString csString("Hello", &mtx); ... }
通过虚函数动态绑定正确类型lock和unlock,代码较简单,但是虚函数不能内联,有性能损失。
模板:
template <class LOCKER> class ThreadSafeString : public string { public: ThreadSafeString(const char *s) : string(s) {} ... int length(); private: LOCKER lock; }; template <class LOCKER> inline int ThreadSafeString<LOCKER>::length() { lock.lock(); int len = string::length(); lock.unlock(); return len; } { ThreadSafeString <CriticalSectionLock> csString = "hello"; ... } { ThreadSafeString <MutexLock> mtxString = "hello"; ... }
模板可以很好的实现多态,也可以在编译时刻确定类型,因此lock和unlock可以内联,这样就没有不必要开销。
要点:
1)因为虚函数不能内联,这对调用频繁、简单的函数的性能开销影响较大。
2)如果设计可行,可以用模板,取代虚函数实现多态,减小性能损失。
- Efficient.C__.Performance.Programming.Techniques.zip (1.4 MB)
- 下载次数: 0
发表评论
-
FreeRTOS
2022-03-05 16:31 248Ref https://blog.csdn.net/weix ... -
串口通讯相关
2018-11-02 13:44 411https://bbs.csdn.net/wap/topics ... -
[转]C++验证IP是否可以PING通
2018-10-30 17:54 1326https://www.cnblogs.com/guoyz13 ... -
C++/MFC 換皮膚
2018-10-20 11:05 477https://blog.csdn.net/u01123991 ... -
WinCE 截屏 - C++ 代碼
2018-08-31 09:45 574// this function create a bmp ... -
Android NDK搭建環境
2017-11-27 13:25 580https://www.cnblogs.com/ut2016- ... -
8583协议相关
2017-10-17 13:38 5738583相关资料,整理中... -
Java高级应用之JNI
2017-06-19 09:00 600参考link http://www.cnblogs.com/l ... -
C++实现ping功能
2017-04-18 11:21 2155基础知识 ping的过程是向目的IP发送一个type=8的I ... -
OpenSSL 编译环境搭建
2017-03-27 15:01 9061 安裝VS2008到 c:\Program Files (x ... -
最优非对称加密填充(OAEP)
2017-03-25 14:53 1582OpenSSL命令---rsautl http://blog. ... -
[Platform Builder] 设置SVM OS build Env
2016-11-10 11:39 01 copy one OSDesign Project to ... -
[Windows] System Error Codes(GetLastError )0-----5999
2016-10-26 13:28 1881ERROR_SUCCESS 0 (0x0) T ... -
开源Windows驱动程序框架
2016-09-17 21:35 871转自 http://code.csdn.net/news/28 ... -
c/c++代码中执行cmd命令
2016-09-14 14:50 1908转自 http://blog.csdn.net/slixinx ... -
C#使用C++标准DLL实例(包含callback)
2016-09-11 19:44 1086C++编写标准Win32DLL如下 头文件 /***** ... -
C#调用C++的DLL搜集整理的所有数据类型转换方式
2016-09-09 16:07 969转自 http://www.cnblogs.com/zeroo ... -
WinCE CPU使用率计算 测试工具
2016-09-08 16:14 991转自 http://blog.csdn.net/jan ... -
switch在C++与C#中的一些差异
2016-09-08 15:19 810参考链接 http://blog.csdn.net/weiwe ... -
C++ 鼠标模拟程序
2016-09-04 12:09 1612转自 http://blog.csdn.net/weixinh ...
相关推荐
- **第二版到第三版**:针对C++11及后续标准进行了更新,涵盖了新的语言特性,如lambda表达式、右值引用和类型推断等。 通过阅读这三个版本的《Effective C++》,程序员可以全面了解C++语言的发展历程,掌握从早期...
《Effective C++ 中文版第三版》是一本深入探讨C++编程实践的书籍,由Scott Meyers撰写,旨在帮助读者提升C++编程的效率和专业性。这本书的高清PDF版本提供了一个清晰易读的阅读体验,是C++程序员进阶学习的理想资料...
"Modern and efficient C++ Thread Pool Library"很可能是一个第三方库,旨在提供比标准库更高级、性能更好的线程池实现。这个库可能包含以下关键知识点: 1. **线程池概念**:线程池是一组预先创建的线程,等待...
In particular, it is difficult to treat vectors and matrices in a manner that is simultaneously efficient and yet allows programming with high-level constructs. The fact that there is still no ...
标题《Real-Time C++:高效面向对象和模板微控制器编程》和副标题“第三版”,说明本书是关于C++编程语言在微控制器编程领域的应用,特别是面向对象编程(Object-Oriented Programming, OOP)和模板(template)编程。...
Pierre Saramito所著的《Efficient C++ Finite Element Computing with Rheolef: Volume 2: Discontinuous Galerkin Methods》一书提供了关于在Rheolef环境下利用C++编写间断有限元程序的详细指南,书中不仅介绍了...
高斯—约当消去法解线性...高斯—约当消去法是一种efficient且广泛应用的线性方程组解法,具有良好的 numerical stability和计算速度。但是,该方法也存在一些缺点,需要选择合适的主元,且消元操作的计算复杂度较高。
3. 《Effective C++》(第二版)与《More Effective C++》:这两本书由Scott Meyers撰写,提供了50条具体的建议,帮助C++程序员写出更高效、更清晰、更少错误的代码。Meyers的"Effective"系列书籍是提高C++编程技巧...
在大部分系统语言中,比如 C 和 C++,您必须进行内存管理。本文将介绍手工的、半手工的以及自动的内存管理实践的基本概念。 追溯到在 Apple II 上进行汇编语言编程的时代,那时内存管理还不是个大问题。您实际上在...
10. **第三方库和容器支持**:可以直接记录STL容器(如vector、map等)以及第三方库中的对象,无需手动序列化。 使用`easyloggingpp`,开发者可以在代码中轻松添加日志记录,例如: ```cpp #include "easylogging+...
2. **THIRD_PARTY_TF_C_LICENSES**: 这个文件很可能包含了TensorFlow所依赖的第三方库的许可信息。TensorFlow作为一个大型项目,会引用许多其他的开源库,这些库也有各自的许可条款。 3. **lib**: 这个目录下应该是...
同时,它使用了FLENS(Flexible Library for Efficient Numerical Solutions)作为构建块,FLENS是一个轻量级的C++库,用于支持数值计算,尤其是线性代数运算。 **小波分析** 小波分析是一种数学工具,结合了频率...