高效C++
一些C++奇技淫巧
xktesla
生命诚可贵,不要总纠结于设计一个完美的架构然后再开始功能的开发,理论与实践相结合,功能与架构并行推进。
展开
-
对六大设计原则的理解
我是野路子出身,因此教科书式的知识我接触的相对较晚,二十三种设计模式可能是在2017年首次接触的,而六大设计原则是2020年才首次听闻。这么久以来,我一直对这六种设计原则理解的比较浅显,因为我总觉得他们之间的界限不够明确,存在很多重叠的规则。 ̄□ ̄||但从个人的项目实践经验上,我还是有一些个人的理解,在此记录,也作为分享。对于一个多模块系统软件,大致上可以理解为:模块之间应尽可能采用接口调用方式,即面向接口编程,这样可以在一个模块改动时对另一个模块影响最小; 模块里类的业务功能设计,遵循单原创 2022-04-26 09:08:52 · 204 阅读 · 0 评论 -
x2lib——一个C++基础库(整合了一些工具类、框架类、轻量开源库)
x2lib: 一个C++基础库(整合了一些工具类、框架类、轻量开源库)原创 2022-04-19 17:16:01 · 183 阅读 · 0 评论 -
如何关闭WinDefender(亲测有效)
Windows自带杀毒软件经常会出现MsMpEng.exe占用CPU高,且无法结束进程的问题。该方法理论上适用于任何windows版本,甚至适用任何不想让其启动的程序。方法(以MsMpEng.exe为例):Step1:系统运行状态下记录下MsMpEng.exe的路径。Step2:关机重启进入PE系统。Step3:找到MsMpEng.exe文件,右键使用记事本打开,随便删除一段内容,保存。Step4:重启系统,搞定!下图是我更改后的MsMpEng.exe,为防止意外做了备份Ms原创 2022-04-16 12:47:45 · 6290 阅读 · 0 评论 -
几种避免死锁的思路
总原则:仅可能的精细化使用锁。1. 使用原子操作;2. 使用读写锁或递归锁,代替互斥锁;3. 借鉴双缓冲原理,比如在释放一个中的元素时,通过原子操作先将其放入一个缓冲区容器,在该缓冲区统一进行释放。暂时只想到这些...原创 2022-04-06 22:26:22 · 362 阅读 · 0 评论 -
一个增强版单例模板(介绍看注释)
namespace x2lib{ namespace xUtils { /** * @brief 增强版单例模板,三个特点: * 1.代码精炼,仅需一个.h文件; * 2.支持对单例对象进行初始化和反初始化; * 3.支持在初始化时向单例对象传参; * @param[in] T 欲设为单例的类 * @param[in] Args 构造函数参数类型 * @author xktesla */ templ.原创 2022-03-25 14:34:14 · 343 阅读 · 0 评论 -
DrawClient技术总结(不定期更新)
前言DrawClient是前段时间刚发布的一个windows看盘助手,融合了我这些年的技术积累,也是我个人兴趣与技术的结合。我将努力保证这个软件体积永远不会超过10M,即便第一个版本就已经9.7M——软件体积不能过大是我对一个软件的第一要求!这篇文章用于记录该软件所用到的技术点以及软件架构。另外,软件服务端也采用纯C++编写,支持windows/linux跨平台。主要技术点【个人编写】x2lib::AppLoad 模块加载框架类(同步/异步,进度通知);x2lib::StrUt.原创 2022-02-10 20:13:56 · 534 阅读 · 0 评论 -
将带捕获的lambda转换为函数指针
如果你和我一样,曾经苦苦寻找一种“lambda转换为函数指针”的方法,结果在你使尽浑身解数搜索后,发现网上的答案基本都是针对“不带捕获”的lambda。但是当你看到这篇文章的时候,恭喜你!找到了。将“带捕获的lambda”转换为函数指针的方法很简单,如下图:但是!!!这种方法可能存在隐患,具体什么隐患?我暂时也说不清,不过可以告诉你的是,之所以编译器默认可以将不带捕获的lambda转为函数指针,而不能将带捕获的lambda转为函数指针,是因为从根本上讲,带捕获的lambda被编译器解释成了对原创 2022-02-09 18:43:21 · 5040 阅读 · 8 评论 -
派生类对象无法访问基类同名函数
标题即本文结论,但关键点在“同名”二字。关于“同名函数”这四个字,在学习C++继承时可能会在两个地方遇到,一个是函数重载,一个便是继承重写。在学习重载时,课本应该有类似表述:函数名相同,但参数列表不同;在学习继承时,课本应该有类似表述:派生类会隐藏基类的同名函数;又由于一般都是先学重载,后学继承,因此很多人会将这两处的“同名函数”的含义搞混淆。而实际上,继承中的“同名函数”,指的仅仅是函数名相同,而参数列表可同可不同,也就是说,只要派生类中出现了同名函数,那么基类中的同名函数都将被隐藏,老规矩,上图原创 2022-01-24 14:47:46 · 651 阅读 · 0 评论 -
你怕不是对unordered_map有误解吧?(附插入顺序和读出顺序相同的maplist)
早期接触stl容器时,都知道std::map有自动排序的特点,有时候业务恰巧需要避免这种排序,便认识了std::unordered_map,正如它的名字——“无序map”。然而,此“无序”可能并非彼“无序”。正确的理解应该是“胡乱排序map”,因为该容器不保证插入顺序与读取顺序一致。如下图所示:怎样?如果颠覆了您的认真,麻烦给本文点个赞。暂时未找到stl有能保证插入顺序和读取顺序一致的键值对容器,迫于无奈,我使用std::list和std::pair实现了一个简易顺序键值对容器(即用例中的map原创 2022-01-20 17:02:39 · 2566 阅读 · 0 评论 -
(C++11)std::regex确实存在bug
最近半年已经是第三次碰到。第一次碰到时没仔细深究,换做boost结果可以了,然后就过去了;第二次又碰到匹配失败,结果发现是宽窄字符的原因,改过之后发现可以了,当时我还告诫自己“不要轻易怀疑权威!”但是抱歉,今天又遇到了,而且这次排除了各种可能的原因,千真万确定位到是stl的问题!编译环境: VS2010工具集(根据资料显示支持不完整的C++11); boost_v1.59; win10_x64;第三方网址匹配结果也是true,唯有stl匹配为false原创 2022-01-19 21:07:20 · 850 阅读 · 0 评论 -
C++如何限制模板类的类型
在使用泛型编程时,有时候会有类似需求:要求T只能为某个类,或某几个类,那应该如何实现?据我所知有3中:使用模板函数; 使用typeid函数; 巧用static_cast;前两种学习理解起来都比较复杂,以后有空了再更,暂时只介绍第3种,示例和方法如图:...原创 2021-12-29 13:59:56 · 4087 阅读 · 0 评论 -
一个好用的C++ string Format“函数”
我这个人总是喜欢在写代码时追求极致,比如总是纠结于变量的命名,内存的消耗,执行的效率,接口的便捷性,代码的可扩展性。。。但很多时候需要在他们之间做取舍,这就导致我在编码时经常陷入僵局,唉。。。真是程序员的可悲,为此几年前我还专门将自己的CSDN签名改成了现在这样。今天我又带来一个函数,挺不起眼的,但是也分享一下const std::string& StrUtil::Format(const char* pszFmt, ...){ va_list body; va_start(body原创 2021-12-26 12:01:26 · 1823 阅读 · 0 评论 -
我们的研发项目B现状及问题
基本情况(截止2021-12-08):开发环境:VS2010工具集代码量(.c;.h;.cpp,不含第三方库和基础库):285万行工程个数(不含第三方库和基础库):200个SVN分支数:107个让人诟病的问题:VS2010工具集对C++11不够友好。但由于个别项目依赖了旧版本lib,一直没有升级工具集。 编译环境搭建过于复杂。以至于同事们都只能从官网下载之前的安装包,解压后覆盖到生成目录,才能保证编译出的程序能正常启动。【离谱...原创 2021-12-26 10:09:31 · 535 阅读 · 0 评论 -
C++实现Split
/*** @brief 分割字符串,使用方法如下:* std::vector<std::string> vecFiled;* Split("1,2,3,4", ",", vecFiled);* @param[in] str 欲分割的字符串* @param[in] div 分隔符* @param[out] vecFiled 存储子串* @return 失败返回-1,否则返回子串个数* @author xktesla@2..原创 2021-12-23 20:29:11 · 1557 阅读 · 0 评论 -
纯C实现的高效好用的Split
先上效果图,代码在最后/*** @brief 分割字符串,并将其保存到pStrs。使用方法如下:* int nStrs = Split("1,2,3,4", ",", nullptr);* char** pStrs = (char**)malloc(nStrs); // 或 char pStrs[m][n]; 只要保证m*n>=nStrs即可* nStrs = Split(str, div, pStrs);* free(pStr.原创 2021-12-23 19:50:28 · 758 阅读 · 0 评论 -
迪米特原则与需求变动的较量——类中函数设计
作为一个开发,最头疼的莫过于需求频繁变动,遇到一个高水平的产品还好,但如果你家产品总是靠着拍脑袋写需求,那简直是噩梦。我在刚毕业时遇到过一个,现如今又遇到一个……六大设计原则中的迪米特原则,提倡的是暴露最少接口,适用于系统与系统对接,模块与模块对接,类与类对接,甚至类中的函数互调。当我们预判到需求可能会发生变动时,在不便沟通时,如何在迪米特原则和可能变动的需求之间取折中解?——需求变动后代码改动最小,且改动对类的内部结构影响最小。首先要具备由顶层设计思维(本文指由类中设计),然后我的方法您才会觉得有原创 2021-12-11 12:04:04 · 184 阅读 · 0 评论 -
个人编码习惯——C++(持续更新)
private/protected函数使用小驼峰,如createWindow public函数使用大驼峰,如CreateWindow 时间变量前缀,tmXXX表示time_t类型,ulXXX表示uint64_t类型,uXXX表示uint32_t类型 命名空间无特殊情况统一小写 分层设计时,某一层的门面头文件不可包含另一层的门面头文件,如ui/ui.h不可包含dao/dao.h 代码段推荐注释方法 头文件#ifndef定义方式推荐如下,VS“菜单-工具”自带了GUID生成工具 当无法确定一个函数原创 2021-11-23 13:46:53 · 648 阅读 · 0 评论 -
对sqlite3二次封装——提供更人性化的接口
先看一段使用方法:另外,关于代码中的字符串动态加密,可使用x2lib中的MixPool类SqliteDB.h#ifndef _20266D69_1291_4C2A_8708_56BE03DB0B74#define _20266D69_1291_4C2A_8708_56BE03DB0B74#include "depends/incfile.h"#include "../../../sqlite3xx/include/sqlite3xx.h"#include "xCores.h"原创 2021-11-09 09:13:24 · 543 阅读 · 0 评论 -
链表性迭代器不会因为元素个数变化而失效
原创 2021-11-04 14:49:57 · 95 阅读 · 0 评论 -
一种优雅的单例写法(三个特点)
该方法从订阅器(Mailer)中抽提出来,详情查看 https://blog.csdn.net/xk641018299/article/details/111461454// 特点:// 1. 可免去创建一个cpp文件:假如单例类比较简单,只需要一个.h文件,通过设计一个_get_static_ptr_()可以免去专门为初始化一个静态成员变量(如s_pInstance)而创建一个cpp文件。// 2. 可在需要的时候对单例对象进行释放:可通过UnInitialize()在必要原创 2021-05-13 10:05:48 · 144 阅读 · 0 评论 -
一个基于消息循环的定时器——TimerCall
之前写过一个TaskRunner,里面有对Timer的支持,但是是基于时间戳的定时器。这次的TimerCall是一个基于消息循环的纯定时器。/*************************************************************************** Copyright(c) 2016-2021 hicker** All rights reserved.** Name : TimerCall.h** Desc : 一个基于消息循环的定时器**.原创 2021-01-16 09:10:14 · 334 阅读 · 0 评论 -
C++奇技淫巧之一——通过static_cast做编译时模版类型限定检查
原创 2020-12-29 09:05:10 · 375 阅读 · 0 评论 -
Mailer——一个优雅的订阅器(支持多线程),接口简单且强大
/*************************************************************************** Copyright(c) 2016-2025 faker** All rights reserved.** Name : Mailer.h** Desc : 一个高级订阅器,接口简单但强大。** 主要特点:** 1.可满足类级[通过继承INotifier/IReceiver]和函原创 2020-12-20 19:44:08 · 265 阅读 · 1 评论 -
DataCacher——一个数据缓冲器,支持多种底层传输协议(Socket、管道等)
#ifndef _E5295BC9_8074_44E9_A754_2B8ADCCB3004#define _E5295BC9_8074_44E9_A754_2B8ADCCB3004#include "depends/incfile.h"#include "CFunc.h"#include "xCores.h"#include "SysUtil.h"namespace x2lib{ /*************************************************.原创 2020-12-18 09:23:15 · 382 阅读 · 0 评论 -
两种获取桌面图标的方法,以及查看几个系统图标隐藏状态的方法
通过跨进程读取SysListView32获取// 主要流程// 初始化OleInitialize(NULL);// 获取IShellFolder对象CComPtr<IShellFolder> pShellFolder;SHGetDesktopFolder(&pShellFolder));// 获取item集合IEnumIDListCComPtr<IEnumIDList> pIds;pShellFolder->EnumObjects(0, .原创 2020-12-11 14:03:37 · 947 阅读 · 0 评论 -
简单好用的轻量C++ JSON库MemJson
开源(地址见文末),只有一个类MemJson,主要成员函数有:1.Put:向当前DatX对象添加一个KV,当K已存在时会进行值替换,返回当前DatX的引用;2.Get(s):从当前DatX对象获取K==s的KV对,仅支持有键名的元素;用XTY包装并返回;3.Get(i):从当前DatX对象获取第i个KV对,支持所有类型元素;用XTY包装并返回;4.Put:向当前DatX添加一个有键名元素,一般用于添加键值对元素,返回当前DatX的引用;5.Add:向当前DatX添加一个无键名元素,一般用于添加原创 2020-11-28 14:50:34 · 333 阅读 · 0 评论 -
一种触发vs链接事件的机制
如下图,在“生成后事件”中加上一个命令,删除某个ilk文件,我写的是生成的目标文件对应的ilk,这样影响最小原创 2020-11-24 11:24:47 · 121 阅读 · 0 评论 -
x2lib——一个C++工具库,包含文件操作、字符串工具、系统工具、网络工具、PE工具、管道、线程池、任务机、广播器、数据缓冲器等。剥离出一些类开源,持续更新
https://github.com/fakerXue/TaskRunner原创 2020-10-21 14:14:36 · 591 阅读 · 0 评论 -
强制把成员函数指针当成一般函数指针用
class A{public: int func(void *p) { return 0; }};int main(){ A a; typedef int(*pfunc)(void *); typedef int(A::*pfunc2)(void *); pfunc2 f2 = &A::func; int b = *(int*)&f2; //__asm //{ ...原创 2020-09-17 13:46:42 · 187 阅读 · 0 评论 -
跨年夜干了个这——一个自适应字符窗口打印器
效果如下图,标题和版权信息,代码在文末/*************************************************************************** Desc : PrintBlock** Param : [in] iStartEnd 两端偏移量** : [in] pString 要打印的字符,不能包含换...原创 2019-12-31 23:20:45 · 239 阅读 · 0 评论 -
个人项目中抽提的一些工具类
/*************************************************************************** Copyright(c) 2016-2020 hicker - 薛凯** All rights reserved.** Name : kCores.h** Desc : 从个人项目中抽提出的一些常用工具类,跨windows和lin...原创 2019-04-18 19:31:07 · 141 阅读 · 0 评论 -
一种简易加密算法
/*稍稍强于普通的异或加密算法,可用于简单加密扩展思路1:使用16/32位的uKey扩展思路2:随机化加密起始点*/// 加密void* Encrypt(void *pIn, void *pOut, DWORD nLen, unsigned char uKey){ memcpy(pOut, pIn, nLen); int i = nLen - 1; ((cha...原创 2018-04-05 16:53:35 · 609 阅读 · 0 评论