基于模板的类型擦除

2023-12-12
阅读 4 分钟
234
基于void*的类型擦除,如C标准库的qsort函数。这中用法在C中是常见的。但因为是通过void*来操作数据,所以存在类型不安全的问题。函数原型:void qsort(void base, size_t nmemb, size_t size, int (compar)(const void , const void ))

学懂现代C++——《Effective Modern C++》之转向现代C++

2023-09-27
阅读 6 分钟
481
现代C++中像auto、智能指针、移动语义等都是一些重大的优化特性,但也有一些像constexpr、nullptr等等这样一个小的特性。这章的内容就是这些小特性的集合。

学懂现代C++——《Effective Modern C++》之类型推导和auto

2023-04-10
阅读 5 分钟
1.1k
之前分享过Scott Meyers的两本书《Effective C++》和《More Effective C++》。这两本书对我深入学习C++有着很大的帮助,建议所有想进阶C++技术的同学都可以看看。但是,这两本书是大神Scott在C++11之前出的,而C++11对于C++社区来说是一次重大的变革,被称为现代C++,用以区分C++11之前的传统C++。

Windows下编译和使用websocketpp

2022-03-27
阅读 1 分钟
2.4k
编译安装BoostWebSocketpp依赖于Boost,因此在使用WebSocketpp前需要编译安装Boost。到 Boost C++ Libraries - Browse /boost-binaries at SourceForge.net 下载稳定版的进行编译。下载的压缩包解压后进入Boost文件夹中,运行bootstrap.bat脚本。脚本运行完成后会生成b2.exe,运行b2.exe就会开始编译,编译时间会比较长...

vscode设置C++代码格式化(Clang-Format)

2022-03-06
阅读 7 分钟
6.6k
vscode中只要安装了C/C++扩展后,在C/C++源文件中右键就能看到格式化文档的选项,这样就能通过该选项或者其快捷键(Shift+Alt+F)来实现快速格式化代码。

《More Effective C++》技术篇——Reference counting(引用计数)

2021-12-08
阅读 4 分钟
1k
Reference counting这项技术,允许多个等值对象共享同一实值。此技术的发展有两种动机,第一是为了简化heap object周边的簿记工作。它可以消除“记录对象拥有权”的负荷,因为当对象运用了reference counting技术,它便拥有它自己。一旦不再有任何人使用它,它便会自动销毁自己。reference counting的第二个发展动机则只是...

《More Effective C++》技术篇——要求(或禁止)对象产生于heap之中

2021-10-31
阅读 2 分钟
918
要求对象产生于heap中,意思是需要阻止clients不得使用new以外的方法产生对象。比较好的方法就是将destructor定义为private,因为constructor的类型太多,所以仍然将constructor定义为public。然后定义一个pseudo destructor来调用真正的destructor。示例如下: {代码...}

《More Effective C++》技术篇——限制某个class所能产生的对象数量

2021-10-24
阅读 2 分钟
813
如下例,只要继承Counted template就可以限制class所能产生的对象数量,超过了设置的maxObjects就会抛出异常。 {代码...}

《More Effective C++》技术篇——将constructor和non-member function虚化

2021-10-17
阅读 2 分钟
906
有一种特别的virtual constructor——所谓virtual copy constructor——也被广泛地运用、virtual copy constructor会返回一个指针,指向其调用者(某对象)的一个新副本。基于这种行为,virtual copy constructor通常以copyself或cloneself命令,或者直接命名为clone。

Linux中获取当前进程的绝对路径

2021-10-03
阅读 1 分钟
1.5k
通过readlink的方式获取。 {代码...}

Linux程序中集成breakpad

2021-09-06
阅读 3 分钟
2.6k
breakpad是google开发的一个跨平台C/C++ dump捕获开源库,崩溃文件使用微软的minidump格式存储,也支持发送这个dump文件到服务器,breakpad可以在程序崩溃时触发dump写入操作,也可以在没有触发dump时主动写dump文件。breakpad支持windows、linux、macos、android、ios等。目前已有Google Chrome, Firefox, Google Picas...

C++11的condition_variable实现WaitForSingleObject功能

2021-04-24
阅读 3 分钟
2.6k
在多线程程序开发中,我们有时会希望等待其他线程结束后在继续执行某些任务。比如常见的,主线程需要等待其他所有子线程结束后再结束程序。在Windows下我们一般使用WaitForSingleObject,或者WaitForMultipleObjects来实现,它们都会等待Object被设置为有信号时才返回的。这样我们在主线程结束的地方wait,在子线程结束...

Linux命令行参数解析——getopt_long

2021-04-18
阅读 3 分钟
2.2k
在linux中,一切皆文件,所有的可执行程序都可以通过命令行启动,程序启动时通常都会带上各种参数以控制程序的行为。所以解析命令行参数通常是一个可执行程序的第一步,下面就来介绍下经常用到的命令行参数的解析函数——getopt_long。

CMake编译遇到这种ABI不兼容问题不要慌

2021-04-05
阅读 1 分钟
6.1k
最近,在Linux下使用CMake编译程序的时候遇到一个问题,特此做一个记录。事情是这样的,我编译的程序使用了2个第三方库,在写好CMakeLists后,启动编译,然后就报链接错误,一直报一堆找不到定义。类似这样的一堆: {代码...} 我仔细检查代码和CMakeLists,各种修改尝试无果。最后,在同事和搜索引擎的帮助下终于找到问...

C++大厂面试真题

2021-04-03
阅读 3 分钟
1.6k
map和set区别在于:map中的元素是key-value(键-值)对:关键字起到索引的作用,值则表示与索引相关联的数据;set是关键字的简单集合,set中的元素都只包含一个关键字。

《More Effective C++》总结笔记(三)

2021-03-07
阅读 4 分钟
1.3k
80-20法则说:一个程序80%的资源用于20%的代码身上。是的。80%的执行时间花在大约20%的代码身上,80%的内存被大约20%的代码使用,80%的磁盘访问动作由20%的代码执行,80%的维护力气花在20%的代码上面。

青蛙跳问题为什么是斐波那契数列

2021-02-15
阅读 3 分钟
1.6k
首先,我们考虑最简单的情况,如果只有一级台阶,那显然青蛙只有一种跳法。如果只有二级台阶,那么青蛙就有两种跳法,一种是每次跳一级,总共跳二次,另一种就是直接跳二级。

《More Effective C++》总结笔记(二)——异常

2021-02-05
阅读 3 分钟
1.1k
简单来说就是,当有资源可能在函数抛异常时而无法释放,这时可以将资源封装到对象内(RAII),利用对象的析构函数来自动释放资源,这样即使有exceptions发生,也不会有资源泄露。

C++程序性能优化指南

2021-01-31
阅读 1 分钟
3.3k
《More Effective C++》书中效率部分第一条就是80—20准则。说得是——大约 20%的代码使用了 80%的程序资源;大约 20%的代码耗用了大约 80%的运行时间;大约 20%的代码使用了 80%的内存。因此,一些简单的优化也能显著提高程序性能。

c++关键字typeid

2021-01-15
阅读 2 分钟
3.2k
type_info的成员函数name返回类型的C-style字符串,但这个返回的类型名与程序中使用的相应类型名不一定一致,其返回值的实现由编译器决定,标准只要求每个类型返回的字符串是唯一的。

一文读懂C++内存对齐

2021-01-10
阅读 2 分钟
2.1k
64位操作系统意味着其cpu拥有更大的寻址能力。理论上来说,其性能相比于32位操作系统会提升1倍。但是这也需要在64位操作系统上运行的软件也是64位的。

《More Effective C++》总结笔记(一)——基础议题、操作符

2020-12-25
阅读 3 分钟
1.2k
Pointers和references之间的另一个重要差异就是,pointers可以被重新赋值,指向另一个对象,reference却总是指向(代表)它最初获得的那个对象。

C++11拾穗

2020-12-23
阅读 8 分钟
1.4k
C++11新关键字alignas:指定对齐大小alignof:获取对齐大小decltypeauto(重新定义):可作为返回值类型后置时的占位符static_assert:静态断言using(重新定义):类型别名或者模板别名noexcept:声明函数不可以抛出任何异常export(弃用,不过未来可能留作他用)nullptrconstexpr:可在在编译期确认的常量表达式thread_local...

c++11强化知识点

2020-11-15
阅读 4 分钟
1.4k
c++11提供了std::initializer_list,将使得类对象的初始化也可以和普通数组或者POD数据一样使用初始化列表的方式。只要为类对象提供初始化列表构造函数即可。

VSCode C++开发环境配置文件(Windows&Mac)

2020-10-06
阅读 4 分钟
1.9k
Windows中使用MSVC来编译源文件一定要通过VS提供的Developer Command Prompt(开发人员命令提示)工具来打开。

重构,第一个案例(C++版)——运用多态取代与价格相关的条件逻辑

2020-02-23
阅读 6 分钟
1.9k
经过上一篇文章——重构,第一个案例(C++版)——分解并重组Statement()中的重构,我们的程序已经有了很大的进步了。但,我们重构的步伐并不能停歇下来。因为,很快客户就开始嘀咕起新需求了。让我们看看这次客户想要些什么。

重构,第一个案例(C++版)——分解并重组Statement()

2020-02-23
阅读 8 分钟
2.8k
在上一篇文章——重构,第一个案例(C++版)——最初的程序,我们已经实现了一个影片出租程序的最初版本。我们也分析了,这个版本的程序虽然能跑起来,没有bug。但是,明显的,程序中有一些“代码的坏味道”。为了重构它,我们首先写出了一段测试代码,方便我们重构的时候进行测试。

重构,第一个案例(C++版)——最初的程序

2020-02-23
阅读 4 分钟
2.3k
这样的总结比较抽象,这里我将写一个系列文章,主要想通过案例来让大家具体的感受一下小步重构的魅力。使用的例子也是Martin Fowler《重构》一书中第一章的案例。不过书中案例是用Java写的,这里我将其改为了C++程序。希望这样对C++程序员能更好的理解重构。

C++实现简单的反射——根据字符串创建类对象

2020-01-15
阅读 6 分钟
4.8k
最近项目需求中需要一个关键功能——根据字符串创建了类对象。由于C++没有类似Java、C#这类动态语言中的反射机制,所以在C++程序中一般用if...else...或者switch来将字符串或者枚举值与类对象的创建方法来进行对应的映射。这里如果我们实现一个简单的反射机制,可以根据字符串创建了类对象就可以简化这个过程,而且无论对...

10分钟带你了解轻量级插件框架x3py

2020-01-15
阅读 9 分钟
3.3k
由于本人目前主要从事的是Windows客户端开发方面的工作,所以本文介绍x3py的侧重点也是从客户端程序开发者方面叙述的。本文主要参考整理自x3py的官方Wiki,修正了一些官方示例中的错误。有兴趣的同学可以直接阅读原文。