- 博客(111)
- 资源 (40)
- 收藏
- 关注
原创 C++模板元编程
泛型编程:模板元编程可以实现类型无关的代码。你可以编写一段代码,并且可以应用到不同的类型上,而无需重复编写这段代码。因为模板元编程在编译时进行计算,避免了运行时的开销。兼容性:不同的编译器对模板元编程的支持程度可能不同,可能会影响代码的可移植性。可读性:模板元编程使代码难以阅读和理解。优化:编译器可以通过查看模板元编程的结果来进行进一步的优化。可以使用模板元把运行时消耗的时间在编译期间进行优化。错误信息:当模板元编程出错时,错误信息通常很难理解。编译时间:过多的模板元编程会导致编译时间增加。
2024-08-16 16:57:51
196
原创 C++智能指针讨论
每次调用 new 或 delete,都会导致系统进入内核模式,进行内存管理的系统调用,这比普通的用户模式代码有更大的开销。同时,过分频繁的内存分配和释放可能会导致内存碎片,使得内存使用效率下降。尽管现代操作系统都有相应的机制来缓解内存碎片问题,但是极端情况下仍然可能出现问题。但是,它在 C++11 中已经被弃用,而在 C++17 中被完全移除,原因在于其所有权转移语义可能会导致问题。可以使用智能指针进行内部管理,避免内存泄漏。修改为下边的代码,是可以的,但是会比较占用CPU资源。这里就有了内存泄漏。
2024-08-16 16:24:57
326
原创 C++性能优化笔记-6-C++元素的效率差异-7-类型转换
C++元素的效率差异类型转换signed与unsigned转换整数大小转换浮点精度转换整数到浮点转换浮点到整数转换指针类型转换重新解释对象的类型const_caststatic_castreinterpret_castdynamic_cast转换类对象类型转换在C++语法中,有几种方式进行类型转换:// Example 7.19int i; float f;f = i; // Implicit type conversionf = (float)i; // C-style t
2023-11-03 17:19:26
2342
1
原创 Sqlite研究系列-1
文章目录简介架构简介sqlite是一个开源的嵌入式关系型数据库。与常规数据库不同的地方是:零配置没有账号概念客户端和服务端运行在应用程序的进程空间,不需要网络配置sqlite可以编译到应用程序中。依赖于文件系统、占用资源少、支持数据库级别锁。sqlite的适用场景主要在嵌入式等资源比较紧张的领域。架构sqlite主要部分包括:...
2022-05-16 20:00:00
317
原创 sizeof运算符用法
sizeof在使用的时候看上去像是一个函数(因为其后面有一对小括号),但他却是一个运算符。他的使用方法有以下3种:a) sizeof(变量名)。b) sizeof(数据类型名)。c) sizeof 变量名。sizeof的返回值类型为size_t。...
2022-04-22 21:13:38
253
原创 C++11特性-委派构造函数-的益处
对于复杂的C++类,有很多个构造函数是非常常见的。为了减少重复代码,经常看到在一个构造函数里调用另一个构造函数的情况。#include <iostream>using namespace std;class Info{public: Info() { Init(); printInfo();}; Info(int i) { Info(); type = i; printInfo();} Info(char e) { name = e; Info(); print
2021-11-02 14:51:27
411
翻译 C++性能优化笔记-16-嵌入式系统中的优化
嵌入式系统中的优化小型嵌入式应用中使用的微控制器的计算资源少于标准PC。时钟频率可能比标准PC低一百倍甚至一千倍;内存量甚至可能比PC机少一百万倍。然而,如果您避免大型图形框架、解释器、即时编译器、系统数据库和其他通常在大型系统上使用的额外软件层和框架,就有可能使软件在如此小的设备上运行得相当快。系统越小,选择使用很少资源的软件框架就越重要。在最小的设备上,您甚至没有操作系统。最好的性能是通过选择一种可以在PC机上交叉编译的编程语言,然后把机器代码传输到设备上。任何需要在设备上编译或解释的语言都是对资
2021-09-27 19:43:06
327
原创 C++性能优化笔记-15-测试执行速度
测试执行速度使用性能监视器计数单元测试的陷阱最坏情况测试测试程序的速度是优化工作的一个重要部分。你必须检查你的修改是否确实提高了速度。有各种各样的分析器可用于查找热点和测量程序的总体性能。然而,分析器并不总是准确的,当程序花费大部分时间等待用户输入或读取磁盘文件时,可能很难准确测量您想要的内容。有关分析的讨论,请参见执行时间分析。确定热点后,隔离热点并仅对代码的这一部分进行测量可能很有用。这可以通过使用所谓的时间戳计数器获取CPU时钟周期来完成。这是一个计数器,用于测量CPU启动后的时钟脉冲数。时钟周
2021-09-27 19:00:32
1008
原创 C++性能优化笔记-14-元编程
元编程模板元编程编译期常量分支元编程编译期常量函数元编程元编程意味着开发可以生成代码的代码。例如,在解释型脚本语言中,通常可以开发一段生成字符串的代码,然后将此字符串解释为代码。元编程在编译型语言如C++中有帮助。如果计算所需的所有输入在编译时可知,则可以在编译时而不是在运行时进行计算。当然,在解释型语言中没有这样的优势,因为一切都在运行时发生。以下技术可以视为C++中的元编程:预处理器指令。例如,使用#if而不是if。这是一个非常有用的删除多余代码的方法,但有严重的限制,预处理器位于编译器之前,
2021-09-27 16:54:02
662
原创 C++性能优化笔记-13-特定优化主题
特定优化主题使用查找表边界检查使用位操作符一次检测多个值整数乘法整数除法浮点除法不要混合使用浮点和双精度浮点数和整数的转换在浮点变量乘法中使用整数操作数学函数静态库VS动态库位置无关代码系统编程使用查找表如果缓存了常数表,则从该表读取值的速度非常快。通常,从一级cache中的表读取值只需要几个时钟周期。利用这一事实,如果函数只有有限数量的输入,我们可以通过用表查找来替换函数调用。让我们以整数阶乘函数(n!)为例。唯一允许的输入是0到12之间的整数。高输入产生溢出,负输入产生无穷大。阶乘函数的典型实现如
2021-09-26 20:58:24
524
原创 C++性能优化笔记-12-开发兼容多个指令集的关键代码
开发兼容多个指令集的关键代码CPU调度策略模型相关调度不同场景测试和维护实现Linux中加载阶段的CPU调度Intel编译器中的CPU调度微处理器制造商会不断添加新指令到指令集中,从而让直行速度更快。使用新指令集的坏处是和旧型号的微处理器不兼容。这个困境可以通过让代码的关键部分兼容多个版本的指令集来解决。这叫CPU调度。应用程序应该自动侦测CPU和操作系统支持哪个指令集,进而选择为最内层的关键循环选择合适的子程序版本。CPU调度策略开发一段支持多指令集的代码代价是高昂的-在开发、测试和维护方面。把这些
2021-09-24 15:21:37
987
原创 C++性能优化笔记-11-使用向量操作
使用向量操作AVX指令集和YMM寄存器AVX512指令集和ZMM寄存器自动向量化使用内建函数对齐数据向量化表查找使用向量类向量类的CPU分发转换串行代码到向量化代码数学函数的向量化对齐动态分配的内存对齐RGB视频或三维向量结论今天的微处理器有向量指令,这让在一个向量的所有元素上进行操作成为可能。这样叫单指令多数据(SIMD)操作。每个向量的大小可以是64位(MMX),128位(XMM),256位(YMM)和512位(ZMM)。当需要在大数据集上,对多个数据执行相同的操作,并且程序逻辑也允许时,向量操作是
2021-09-22 19:31:50
4200
原创 C++性能优化笔记-10-无序执行
无序执行无序执行无序执行所有现代的X86处理器都可以无序执行指令。下边的例子利用了这个能力:// Example 11.1afloat a, b, c, d, y;y = a + b + c + d;这个表达式按照((a+b)+c)+d)计算。这是一个依赖链。可以进行修改改善:// Example 11.1bfloat a, b, c, d, y;y = (a + b) + (c + d);现在(a+b)和(c+d)可以同时进行,可以节约几个时钟周期。不能假定编译器会自动进行上述优化
2021-09-22 10:44:50
234
原创 C++性能优化笔记-9-多线程
多线程线程同步CPU时钟频率限制于物理硬件因素。在时钟频率的限制下,提高CPU密集型程序吞吐量的方式是,同时进行多个任务。任务并行有三种方式:使用多个CPU或多核CPU;利用现在CPU的乱序能力;利用现代CPU的向量操作;为了利用CPU的多核能力,需要把问题拆分为多个线程。线程同步...
2021-09-18 14:38:25
1732
原创 expected unqualified-id before numeric constant
在编译开源的第三方库时,可能会遇到错误:expected unqualified-id before numeric constant分析后发现,是自己定义的枚举变量名与第三方库中的同名了,导致变量重复定义。解决方法:自己的类型加上命名空间自定义的类型添加特定的前缀...
2021-09-17 17:22:47
7863
原创 在QT的信号槽中使用自定义数据类型
qt中使用信号槽来处理GUI与后台数据同步是不错的。耗时的任务可以在处理完数据后使用信号通知UI更新。对于qt中的已有类型,可以直接使用。但,多数时候都需要用到自定义类型。如果像内建类型那样使用,编译时正常,但运行时会报错:QObject::connect: Cannot queue arguments of type 'xxxx' (Make sure 'xxxx' is registed using qRegisterMetaType().)原因:在跨线程进行信号槽连接时,为了不阻塞发送信号的线程,
2021-09-17 17:15:41
923
原创 C++性能优化笔记-8-优化存储访问
优化存储访问优化存储访问代码和数据缓存缓存组织一起使用的函数应该存储在一起一起使用的变量应该存储在一起数据对齐动态内存分配数据结构和容器类字符串顺序访问数据大数据结构中的cache冲突显式cache控制优化存储访问代码和数据缓存缓存是主存的代理。缓存是为了以最快的可能访问最常用的数据。缓存组织大多数chache以行和集合的方式组织。cache机制的更多细节,参考(en.wikipedia.org/wiki/L2_cache)。如果程序中包含很多变量和对象,它们又刚好分布在映射到相同cache的内
2021-09-17 16:14:32
1430
原创 C++性能优化笔记-7-编译器中的优化-5-编译器做了什么
编译器中的优化检查编译器做了什么检查编译器做了什么研究编译器产生的代码,看它优化代码的程度,是非常有用的。有时,编译器会相当奇妙地使代码更高效,有时它蠢得难以置信。看编译器输出通常可以透露出什么可以通过修改源代码来改进,如下面例子所示。检查编译器产生代码最好的方式是使用汇编语言输出的编译器选项。在大多数编译器上,你可以通过从命令行使用相关优化选项,以及汇编输出的选项-S或/Fa,调用编译器来完成。在某些系统上,IDE也有可用的汇编输出选项。如果编译器没有汇编输出选项,使用目标文件反汇编器。注意,In
2021-09-13 17:01:16
381
原创 C++性能优化笔记-7-编译器中的优化-4-编译器优化选项、优化指令
编译器中的优化编译器优化选项优化指令编译器优化选项所有C++编译器有各种你可以打开、关闭的优化选项。学习正在使用编译器可用的选项,并打开所有相关选项,是重要的。许多优化选项与调试不兼容。调试器可以一次执行一行代码,并显示所有变量的值。显然,在部分代码被重排、内联或优化掉时,这是不可能的。通常制作可执行程序的两个版本:带有完整调试支持,在程序开发期间使用的调试版本,以及打开所有相关优化选项的发布版本。大多数IDE(集成开发环境)有制作目标文件与可执行文件的调试版本与发布版本的设施。确保区分这两个版本,在
2021-09-12 17:07:19
1835
原创 C++性能优化笔记-7-编译器中的优化-3-编译器、CPU优化的障碍
编译器中的优化编译器优化的障碍不能跨模块优化指针别名动态内存分配纯函数虚函数与函数指针代数化简浮点归纳变量具有非内联拷贝的内联函数CPU优化的障碍编译器优化的障碍有几个因素会阻止编译器进行预期的优化。程序员知道这些障碍并知道如何避免它们。优化的某些重要的障碍讨论如下。不能跨模块优化编译器没有除正在编译模块以外其他模块中的函数信息。这阻止了跨函数调用的优化。如:// Example 8.20**module1.cpp**int Func1(int x) { return x*x +
2021-09-12 14:30:18
880
原创 C++性能优化笔记-7-编译器中的优化-2-不同编译器的对比
编译器中的优化不同编译器的对比不同编译器的对比下表对比了不同的编译器的优化效果。必须强调的是,编译器在不同的测试例子上可能表现不同。下表仅供参考。优化方法GnuClangMicrosoftIntel通用优化函数内联xxxx常量折叠xxxx常量传播xxxx循环的常量传播xx--指针消除xxxx公共子表达式消除xxxx寄存器变量xxxxFused multiply a
2021-09-11 17:14:08
664
原创 C++性能优化笔记-7-编译器中的优化-1-编译器如何优化代码
编译器中的优化编译器如何优化函数内联常量折叠和常量传播指针消除公共子表达式消除寄存器变量生命周期分析合并相同的分支消除跳转循环展开循环不变代码移动归纳变量调度代数化简去虚拟化编译器如何优化现代编译器能够对代码做很多修改,以提高性能。了解编译器可以做什么,不可以做什么,对开发者来说是有用的。下边的小节描述了开发者需要了解的一些编译器优化的内容。函数内联编译器可以用被调用函数体来替换原来的函数调用。例子:// Example 8.1afloat square (float a) { re
2021-09-10 18:56:07
1563
1
原创 C++性能优化笔记-6-C++元素的效率差异-18-预处理和命名空间
C++元素的效率差异预处理指令命名空间预处理指令就程序性能而言,预处理指示(所有以#开头的东西)是没有代价的,因为它们在程序编译前被解决了。#if指令用于支持多平台或同一个源代码的多种配置。#if比if更高效,因为#if在编译时解析,而if在运行时。在用于定义常量时,#define等价于const定义。例如,#define ABC 123与const int ABC = 123;一样高效,因为在大多数情形里,优化的编译器会用值替换一个整数常量。不过,在某些情形里,const int声明需要内存空间,
2021-09-08 18:39:34
214
原创 C++性能优化笔记-6-C++元素的效率差异-17-栈展开、NAN和INF传播
C++元素的效率差异栈回滚的其他情形NAN和INF的传播栈回滚的其他情形前面的章节描述了由异常处理使用的、称为栈回滚的机制,在异常出现时,不使用正常返回途径跳出函数后,由异常处理用来清理及调用所有必须的析构函数。这个机制也用在其他两个情形里:在线程终止时,可以使用栈回滚机制。目的是检测线程中声明的对象是否有需要调用的析构函数。建议在终止线程前,从要求清理的函数返回。不能确定的,_endthread()的调用会清理栈。取决于实现。在使用函数longjmp跳出一个函数时,也使用栈回滚机制。尽可能避免使
2021-09-08 18:29:30
149
原创 C++性能优化笔记-6-C++元素的效率差异-16-异常和错误处理
C++元素的效率差异异常与错误处理异常与向量代码避免异常处理的代价开发异常安全代码异常与错误处理运行时错误已发异常,这些异常可以通过陷阱或软件中断的形式被检测到。这些异常可以通过 try-catch 块捕捉到。程序会崩溃并产生一个错误消息,如果异常处理被启用并且没有 try-catch 块。异常处理的目的是检测很少出现的错误,并以一个优雅的方式从错误中恢复。你可能认为只要错误不发生,异常处理就不需要额外时间,但不幸的是,这不总是成立的。程序必须进行许多簿记以便知道如何从异常事件中恢复。这个簿记的代价很
2021-09-08 16:52:57
285
原创 C++性能优化笔记-6-C++元素的效率差异-14-模板
C++元素的效率差异模板模板就在编译前模板参数被它们的值替代而言,模板类似于宏。下面的例子展示了函数参数与模板参数间的差别:// Example 7.46int Multiply (int x, int m) {return x * m;}template int MultiplyBy (int x) {return x * m;}int a, b;a = Multiply(10,8);b = MultiplyBy<8>(10);a与b都将给出值10 * 8 = 80。差
2021-09-07 20:22:50
783
原创 C++性能优化笔记-6-C++元素的效率差异-11-结构体和类
C++元素的效率差异结构体和类类数据成员类成员函数(方法)虚函数运行时类型识别(RTTI)继承构造函数与析构函数结构体和类时至今日,编程教材推荐面向对象编程,作为使软件更清晰及模块化的一种手段。所谓的对象是结构体及类的实例。面向对象编程形式对程序性能有积极与消极的影响。积极的影响有:一起使用的变量也保存在一起,如果它们是结构体或类的成员。这使得数据缓存更高效。作为类成员的变量无需作为参数传递给类成员函数。这些变量避免了参数传递的开销。消极影响有:一些程序员把代码分到太多的小的类中。这是低
2021-09-06 19:13:34
1128
原创 C++性能优化笔记-1-平台选择
一、硬件平台的选择随着硬件设计变化和性能的提升,硬件平台选择越来越不重要了。现在硬件平台的选择更多考虑的不是处理能力,而是价格、兼容性、可替代性、开发工具的可得性等。采用普通PC网络集群,往往比投资大型机更便宜和有效。超级计算机在科学计算领域仍然有优势。但是对于绝大多数普通任务,标准PC更具性价比。由于现在主流处理器已经是X64,CISC指令集寄存器太少的问题已经得到缓解。对于关键应用,不建议采用依赖网络资源的轻量客户端模式,原因是网络资源的响应时间无法控制。现在小型手持设备越来越多,其硬件资源比P
2021-08-23 17:20:40
599
翻译 库开发技巧-2-改善代码以符合二进制兼容
文章目录添加新数据成员到没有d指针的类中添加重新实现的虚函数使用新的类在叶子类中添加一个新的虚函数使用signals替代虚函数添加新数据成员到没有d指针的类中如果已有的类没有bigflags,预保留的变量,也没有d指针,但是还需要添加新的私有成员变量。还是有补救的办法的。如果类继承自QObject,可以把附加的数据成员写入一个特定的子类中,并通过遍历子类列表(QObject::children())来查找附加的数据成员。不过,一个更好更快的方法是用哈希表来存储类对象和附加数据的映射关系。为了达到这个目的
2021-08-12 19:48:21
160
翻译 类库开发技巧-1
文章目录前言Bitflags使用d指针前言当开发类库时,最大的问题是不能安全地添加数据成员。因为这样做会改变包含被修改的类对象(包括子类)的所有类、结构体或数组的大小和布局。Bitflags一个例外情况是 bitflags。如果在定义enums或bool时使用bitflags,可以至少安全地增加成员到下个字节-1.例如:一个类有如下成员unsigned int m1 : 1;unsigned int m2 : 3;unsigned int m3 : 1;修改为unsigned int
2021-08-11 16:17:03
210
翻译 C++二进制兼容性总结
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、什么是二进制兼容?二、保持二进制兼容的条件1.可以做的事情2.不可以做的事情补充说明应该做的总结前言对于C-Like等编译型语言,没有虚拟机的协助,随着项目维护,必然会产生很多兼容性问题。此文作为个人对其中的二进制兼容性进行一下总结。一、什么是二进制兼容?对于一个库,如果使用旧版本的主程序,无需重新编译就可以连接新版本的库,并正常运行,则这个库是二进制兼容的。如果主程序不需要修改,但需要重新编译才可以使用新版
2021-08-11 14:33:35
2752
原创 Ubuntu图形界面卡死问题
在虚拟机环境下使用Ubuntu做图形应用程序开发,有时候会遇到卡死的情况,这个情况有可能只是图形界面卡死,可以尝试重启图形界面来解决。ctrl+alt+F2-6,切换至终端登录。执行:sudo service lightdm restart然后,ctrl+alt+F7,切换回图形界面,看是否重启成功。...
2021-08-05 10:14:33
6902
原创 undefined reference to `vtable for’”问题的原因及解决方法
如果使用QtCreator创建类时,没有选择继承自QObject类或其子类,而在创建后手工修改继承自QObject并手工添加Q_OBJECT宏,则在编译时有可能会出现"undefined reference to `vtable for’…有时候,手快(尤其程序员非常迷恋快捷键【doge】),会不小心跳过一些关键步骤,导致出现一些问题。如果添加后,没有马上编译,而是编写了很多业务代码后编译,才发现qt给你报了大量错误。经过自己摸索,还有网友的提示,总结了一些方法供大家参考。
2017-03-23 20:06:29
87235
39
原创 QT5.8-程序最小化到托盘
对于类似于后台服务的界面非常简单的程序,不需要总显示UI界面,最小化至托盘就是比较好的一个选择.第一步:实现程序启动直接最小化至托盘图标. 1.新建一个QT项目(本例基类QQWidget,其他基类类似), 不勾选生成ui文件. 2.寻找一个图标文件(icon.ico),以供程序在托盘显示.向项目中添加一个资源文件,并添加prefix包含图标文件. 3.修改main.cpp中的w.show(
2017-03-07 18:17:58
1981
1
翻译 数据结构-串(字符串)
// my_string.h#ifndef MY_STRING_H#define MY_STRING_H#include using namespace std;const int MAXSIZE=100;class MyString{public: MyString(const MyString& copy); MyString(const char *
2016-12-06 16:00:49
577
1
原创 数据结构-优先级队列
// queue_node.h#ifndef QUEUE_NODE_H#define QUEUE_NODE_H#include template class PriorityQueue;template class QueueNode{private:
2016-12-04 17:12:27
512
1
原创 数据结构-链式队列
// link_queue_node.h#ifndef LINK_QUEUE_NODE_H#define LINK_QUEUE_NODE_H#include template class LinkQueue;template class QueueNode{private: friend class Li
2016-12-02 15:07:14
388
1
原创 数据结构-顺序队列
// seq_queue.h#ifndef SEQ_QUEUE_H#define SEQ_QUEUE_H#include template class Sequence_queue{public: Sequence_queue(int size) : m_front(0), m_rear(0), m_count(0), m_maxsi
2016-12-01 15:35:15
275
1
原创 数据结构-链式栈
编译错误:passing ‘const LinkStack’ as ‘this’ argument discards qualifiers [-fpermissive] 解决方法:C++中const 引用的是对象时只能访问该对象的const 函数,因为其他函数有可能会修改该对象的成员,编译器为了避免该类事情发生,会认为调用非const函数是错误的。 函数末尾加const,表示不会修改该对象的成员
2016-11-30 21:48:07
456
1
ARM体系结构与编程.pdf
2012-10-26
putty通信工具
2012-10-25
Thinking in C++
2011-03-26
JCREATOR 4.5官方安装包
2009-09-14
UNIX网络编程卷2
2009-08-08
UNIX网络编程卷2(2)进程间通信
2009-08-08
UNIX网络编程卷2(1)
2009-08-08
华清远见linux驱动程序开发
2009-07-25
华清远见linux驱动程序开发
2009-07-25
华清远见Linux培训资料集合
2009-07-25
华清远见Linux培训资料集合
2009-07-25
华清远见Linux培训资料集合
2009-07-25
华清远见Linux培训资料集合
2009-07-25
华清远见Linux培训资料集合
2009-07-25
华清远见Linux培训资料集合
2009-07-25
编译原理(陈火旺第三版)练习答案.pdf
2009-07-25
DM6446开发攻略
2012-10-26
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人