c++
文章平均质量分 94
办公模板库 素材蛙
命数如织 当为磐石
展开
-
设计模式之美40-如何在编译期遍历数据?
静态反射的基本原理和实现手法,在罗能的博客文章中已经有了较详细的描述 [1]。建议你去读一下。我在这里将不再重复其中的一些技术细节,而是强调基本原理,以及我这边实现得不一样的地方。字段名称字段类型字段值的访问我们下面需要考虑的,就是(假设)给定了索引值0、字段内容(long)v1,如何来生成字段的定义。… };对(long)v1进行STRIP后,我们得到v1;再对其STRING处理,即得到字符串"v1"。字段类型也不复杂。唯一的麻烦是我没找到宏处理的方法从(long)v1得到long。原创 2023-04-30 09:26:09 · 114 阅读 · 1 评论 -
设计模式之美39-如何在编译期玩转字符串?
你好,我是吴咏炜。在实际的项目里,我遇到过不少在编译期处理字符串的需求。今天,我们就来把这个问题好好讨论一下。原创 2023-04-30 09:25:32 · 113 阅读 · 0 评论 -
设计模式之美38-折叠表达式:高效的编译期展开
你好,我是吴咏炜。当我在写“应用可变模板和 tuple 的编译期技巧”时,有朋友就建议可以讨论一下折叠表达式 [1]。不过,在那时候我对折叠表达式并没有什么实际应用经验,觉得它用处不大,于是就略过了。幸好我只是没有写,而没有乱加评论,否则就图欧图森破(too old, too simple)了。很多功能,只有在你真正需要到它、又掌握如何使用的时候,你才会觉得真正有用。很多 C++ 里看似用处不大的特性,都是这种情况(当然也不是所有,否则就不会有对特性的废弃和删除了)。原创 2023-04-30 09:24:47 · 62 阅读 · 0 评论 -
设计模式之美37|参数传递的正确方法和模板的二进制膨胀
你好,我是吴咏炜。上一讲我们讨论的视图类型的对象,通常和内置类型的对象一样,是使用传值的方式来进行传参的。这种方式非常简单,也是比较推荐的 C++ 的做法,但这种方式存在对对象类型的限制。在对象比较大的时候,或者可能比较大的时候,按值传参就可能有性能问题。这包括了大部分的函数模板,除非你能预知用来实例化模板的参数。此外,还有很多对象可能是不可复制、甚至不可移动的,显然,这些对象你也不可能按值传参。此时,你就只能使用引用或指针来传参了。原创 2023-04-30 09:24:34 · 186 阅读 · 0 评论 -
设计模式之美36|访问对象的代理对象:视图类型
你好,我是吴咏炜。前面我们用连续五讲讨论了内存相关的很多问题,这是因为在 C++ 里,开发人员需要认真考虑对象的生命周期,包括对其内存进行管理。我们需要保证对象使用的内存,不会在对象还在使用时就会被释放。在其他一些语言里,或者使用跟踪垃圾收集,或者使用引用计数,可以自动化这一过程。C++ 理论上来讲也可以这样做,如到处使用shared_ptr,但这样的话,程序的执行性能就会受到影响。原创 2023-04-30 09:23:55 · 80 阅读 · 0 评论 -
设计模式之美35-发现和识别内存问题:内存调试实践
你好,我是吴咏炜。作为内存相关话题的最后一讲,今天我们来聊一聊内存调试的问题。原创 2023-04-30 09:22:29 · 87 阅读 · 0 评论 -
设计模式之美33|性能测试的正确姿势:性能、时间和优化
假如我们有一个int类型的变量x,那x * 2 / 2的结果是几?如果 C++ 把有符号整数运算溢出的结果定义为补码的内存表示,也就是说,32 位正整数2302^{30}230)乘以 2 的结果就是−231-2^{31}−231),再除以 2 的话,我们就不能得回原先的数值,而是得到了−230-2^{30}−230这样的话,x * 2 / 2就不能优化为x!那能不能使用异常呢?也不行。跟除零不一样,整数运算溢出不会产生硬件中断。原创 2023-04-30 09:22:21 · 110 阅读 · 0 评论 -
设计模式之美34|快速分配和释放内存:内存池
在第 31 讲我提到过,利用同一类型的对象的大小完全相同这一特性,可以实现一个高度优化的内存池。只是利用类特定的分配和释放函数,使用场景会比较受限。下面我会描述利用这个思路实现的一个内存池,既可以用在类特定的分配和释放函数里,也可以用在容器的分配器里。原创 2023-04-30 09:21:20 · 129 阅读 · 0 评论 -
设计模式之美32|容器里的内存管理:分配器
你好,我是吴咏炜。上一讲里我们讨论了 C++ 里内存管理的基本工具,分配和释放函数。今天,我们来讨论一下容器里管理内存的机制——分配器(allocator)。原创 2023-04-29 08:50:59 · 235 阅读 · 0 评论 -
设计模式之美31|new和delete背后:分配函数和释放函数
你好,我是吴咏炜。有一个我之前没讲、但挺有意思的话题是new和delete行为的定制。这件事情我很久很久以前就做过 [1],没往专栏里写的最主要原因是,这实际是 C++98 就有的高级技巧,不属于现代 C++。不过,在目前续写的内容里,我就不再拘泥必须新了,既然这是 C++ 里现在仍然需要的技巧,那就还是介绍一下。何况,这部分在现代 C++ 里还是有点新内容的。原创 2023-04-29 08:49:48 · 144 阅读 · 0 评论 -
现代C++编程实战加餐-部分课后思考题答案合集
答:对于代码严谨、具有形式化思维的人,“概念”是个福音,它不仅可以大量消除 SFINAE 的使用,还能以较为精确和形式化的形式在代码里写出对类型的要求,使得代码变得清晰、易读。答:UTF-32 下,一个字符就是一个基本的处理单位,一般不会出现一个字符跨多个处理单位的情况(UTF-8 和 UTF-16 下会发生)。这样的代码更容易推理,更不容易在后续修改中出错,也更能让编译器做(返回值)优化。答:多个线程里,如果没有或不能事先约定访问顺序,同时进行可阻塞的资源访问,访问顺序可以形成一个环,就会引发死锁。原创 2023-04-26 08:09:35 · 102 阅读 · 0 评论 -
现代C++编程实战41|对象传参和返回的最佳实践
你好,我是吴咏炜。在我们讨论过,《C++ 核心指南》的 F.20 条款推荐我们优先使用返回对象的方式。在那里,我们简单地讨论了一些例外情况,并没有深入展开。同时,我们没有讨论传参形式的选择,而事实上,这两个问题是紧密相关的——尤其是考虑到出参和返回语句都是函数向外传递对象的方式。今天,我们就来深入探讨一下这个问题。原创 2023-04-26 08:07:49 · 139 阅读 · 0 评论 -
现代C++编程实战40-如何在编译期遍历数据?
静态反射的基本原理和实现手法,在罗能的博客文章中已经有了较详细的描述 [1]。建议你去读一下。我在这里将不再重复其中的一些技术细节,而是强调基本原理,以及我这边实现得不一样的地方。字段名称字段类型字段值的访问我们下面需要考虑的,就是(假设)给定了索引值0、字段内容(long)v1,如何来生成字段的定义。… };对(long)v1进行STRIP后,我们得到v1;再对其STRING处理,即得到字符串"v1"。字段类型也不复杂。唯一的麻烦是我没找到宏处理的方法从(long)v1得到long。原创 2023-04-26 08:07:32 · 227 阅读 · 0 评论 -
现代C++编程实战39-如何在编译期玩转字符串?
你好,我是吴咏炜。在实际的项目里,我遇到过不少在编译期处理字符串的需求。今天,我们就来把这个问题好好讨论一下。原创 2023-04-26 08:06:56 · 627 阅读 · 0 评论 -
现代C++编程实战38-折叠表达式:高效的编译期展开
你好,我是吴咏炜。当我在写“应用可变模板和 tuple 的编译期技巧”时,有朋友就建议可以讨论一下折叠表达式 [1]。不过,在那时候我对折叠表达式并没有什么实际应用经验,觉得它用处不大,于是就略过了。幸好我只是没有写,而没有乱加评论,否则就图欧图森破(too old, too simple)了。很多功能,只有在你真正需要到它、又掌握如何使用的时候,你才会觉得真正有用。很多 C++ 里看似用处不大的特性,都是这种情况(当然也不是所有,否则就不会有对特性的废弃和删除了)。原创 2023-04-26 08:05:48 · 224 阅读 · 0 评论 -
现代C++编程实战37|参数传递的正确方法和模板的二进制膨胀
你好,我是吴咏炜。上一讲我们讨论的视图类型的对象,通常和内置类型的对象一样,是使用传值的方式来进行传参的。这种方式非常简单,也是比较推荐的 C++ 的做法,但这种方式存在对对象类型的限制。在对象比较大的时候,或者可能比较大的时候,按值传参就可能有性能问题。这包括了大部分的函数模板,除非你能预知用来实例化模板的参数。此外,还有很多对象可能是不可复制、甚至不可移动的,显然,这些对象你也不可能按值传参。此时,你就只能使用引用或指针来传参了。原创 2023-04-26 08:05:09 · 187 阅读 · 0 评论 -
现代C++编程实战36|访问对象的代理对象:视图类型
你好,我是吴咏炜。前面我们用连续五讲讨论了内存相关的很多问题,这是因为在 C++ 里,开发人员需要认真考虑对象的生命周期,包括对其内存进行管理。我们需要保证对象使用的内存,不会在对象还在使用时就会被释放。在其他一些语言里,或者使用跟踪垃圾收集,或者使用引用计数,可以自动化这一过程。C++ 理论上来讲也可以这样做,如到处使用shared_ptr,但这样的话,程序的执行性能就会受到影响。原创 2023-04-26 08:04:58 · 218 阅读 · 0 评论 -
现代C++编程实战35-发现和识别内存问题:内存调试实践
你好,我是吴咏炜。作为内存相关话题的最后一讲,今天我们来聊一聊内存调试的问题。原创 2023-04-26 08:04:01 · 172 阅读 · 0 评论 -
现代C++编程实战34|快速分配和释放内存:内存池
在第 31 讲我提到过,利用同一类型的对象的大小完全相同这一特性,可以实现一个高度优化的内存池。只是利用类特定的分配和释放函数,使用场景会比较受限。下面我会描述利用这个思路实现的一个内存池,既可以用在类特定的分配和释放函数里,也可以用在容器的分配器里。原创 2023-04-26 08:02:46 · 345 阅读 · 0 评论 -
现代C++编程实战30-Coroutines:协作式的交叉调度执行
协程是一个很早就被提出的编程概念。根据高德纳的描述,协程的概念在 1958 年就被提出了。不过,它在主流编程语言中得到的支持不那么好,因而你很可能对它并不熟悉吧。如果查阅维基百科,你可以看到下面这样的定义 [1]:协程是计算机程序的⼀类组件,推⼴了协作式多任务的⼦程序,允许执⾏被挂起与被恢复。相对⼦例程⽽⾔,协程更为⼀般和灵活……等学完了这一讲,也许你可以明白这段话的意思。但对不了解协程的人来说,估计只能吐槽一句了,这是什么鬼?很遗憾,在 C++ 里的标准协程有点小复杂。原创 2023-04-25 09:50:08 · 581 阅读 · 0 评论 -
现代C++编程实战29-Ranges:无迭代器的迭代和更方便的组合
intint你应该已经见到过好多次了。有没有觉得这个代码有点重复、有点无聊呢?尤其是里面的begin和end?很多人都留意到了迭代器虽然灵活,但不是一个足够高级的抽象——尤其是我们已经对 C 数组都可以进行基于“范围”的循环之后。sort(a);intsort(a);intsort(a);这是真正可以编译的代码,用我们上一讲讲过的环境——最新版的 MSVC(编译命令行上需要额外加选项)或 GCC 7+——都可以。原创 2023-04-25 09:47:57 · 324 阅读 · 0 评论 -
现代C++编程实战28-Concepts:如何对模板进行约束
你好,我是吴咏炜。从这一讲开始,我们进入了未来篇,展望一下即将在 C++20 出现的新功能。我们第一个要讨论的,是 concepts(概念)——一个难产了很多年才终于进入 C++ 的新功能。原创 2023-04-25 09:44:25 · 571 阅读 · 0 评论 -
现代C++编程实战27-C++RESTSDK:使用现代C++开发网络应用
有了初步印象之后,现在我们可以回过头看看 C++ REST SDK 到底是什么了。HTTP 客户端HTTP 服务器任务JSONURI异步流WebSocket 客户端OAuth 客户端上面的例子里用到了 HTTP 客户端、任务和 URI(实际上是由string_t隐式构造了uri),我们下面再介绍一下异步流、JSON 和 HTTP 服务器。原创 2023-04-25 09:42:32 · 1591 阅读 · 0 评论 -
现代C++编程实战26-Easylogging++和spdlog:两个好用的日志库
Easylogging++ 一共只有两个文件,一个是头文件,一个是普通 C++ 源文件。事实上,它的一个较早版本只有一个文件。正如 Catch2 里一旦定义了编译速度会大大减慢一样,把什么东西都放一起最终证明对编译速度还是相当不利的,因此,有人提交了一个补丁,把代码拆成了两个文件。使用 Easylogging++ 也只需要这两个文件——除此之外,就只有对标准和系统头文件的依赖了。要使用 Easylogging++,推荐直接把这两个文件放到你的项目里。原创 2023-04-25 09:42:06 · 1271 阅读 · 0 评论 -
现代C++编程实战25-两个单元测试库:C++里如何进行单元测试
你好,我是吴咏炜。单元测试已经越来越成为程序员工作密不可分的一部分了。在 C++ 里,我们当然也是可以很方便地进行单元测试的。今天,我就来介绍两个单元测试库:一个是 Boost.Test [1],一个是 Catch2 [2]。原创 2023-04-25 09:40:47 · 1643 阅读 · 0 评论 -
现代C++编程实战24-Boost:你需要的“瑞士军刀”
你好,我是吴咏炜。我们已经零零碎碎提到过几次 Boost 了。作为 C++ 世界里标准库之外最知名的开放源码程序库,我们值得专门用一讲来讨论一下 Boost。原创 2023-04-25 09:38:20 · 410 阅读 · 0 评论 -
现代C++编程实战23-数字计算:介绍线性代数和数值计算库
你好,我是吴咏炜。科学计算在今天已经完全可以使用 C++ 了。我不是从事科学计算这一领域的工作的,不过,在工作中也多多少少接触到了一些计算相关的库。今天,我就给你介绍几个有用的计算库。原创 2023-04-25 09:36:53 · 435 阅读 · 0 评论 -
现代C++编程实战22-处理数据类型变化和错误:optional、variant、expected和Herbception
你好,我是吴咏炜。我们之前已经讨论了异常是推荐的 C++ 错误处理方式。不过,C++ 里有另外一些结构也很适合进行错误处理,今天我们就来讨论一下。原创 2023-04-25 09:35:19 · 650 阅读 · 0 评论 -
现代C++编程实战21-工具漫谈:编译、格式化、代码检查、排错各显身手
你好,我是吴咏炜。现代 C++ 语言,我们讲到这里就告一段落了。今天我们正式开启了实战篇,先讲一个轻松些的话题——工具。原创 2023-04-25 09:34:05 · 542 阅读 · 0 评论 -
现代C++编程实战19-thread和future:领略异步中的未来
你好,我是吴咏炜。编译期的烧脑我们先告个段落,今天我们开始讲一个全新的话题——并发(concurrency)。原创 2023-04-24 11:36:44 · 488 阅读 · 0 评论 -
现代C++编程实战18-应用可变模板和tuple的编译期技巧
你好,我是吴咏炜。今天我们讲一个特殊的专题,如何使用可变模板和 tuple 来完成一些常见的功能,尤其是编译期计算。原创 2023-04-24 11:33:10 · 192 阅读 · 0 评论 -
现代C++编程实战17-函数式编程:一种越来越流行的编程范式
你好,我是吴咏炜。上一讲我们初步介绍了函数对象和 lambda 表达式,今天我们来讲讲它们的主要用途——函数式编程。原创 2023-04-24 11:26:41 · 1282 阅读 · 1 评论 -
现代C++编程实战16-函数对象和lambda:进入函数式编程
你好,我是吴咏炜。本讲我们将介绍函数对象,尤其是匿名函数对象——lambda 表达式。今天的内容说难不难,但可能跟你的日常思维方式有较大的区别,建议你一定要试验一下文中的代码(使用 xeus-cling 的同学要注意:xeus-cling 似乎不太喜欢有 lambda 的代码😓;遇到有问题时,还是只能回到普通的编译执行方式了)。原创 2023-04-24 11:19:57 · 123 阅读 · 0 评论 -
现代C++编程实战15-constexpr:一个常态的世界
你好,我是吴咏炜。我们已经连续讲了几讲比较累人的编译期编程了。今天我们还是继续这个话题,但是,相信今天学完之后,你会感觉比之前几讲要轻松很多。C++ 语言里的很多改进,让我们做编译期编程也变得越来越简单了。原创 2023-04-24 11:13:19 · 401 阅读 · 0 评论 -
现代C++编程实战14-SFINAE:不是错误的替换失败是怎么回事
你好,我是吴咏炜。我们已经连续讲了两讲模板和编译期编程了。今天我们还是继续这个话题,讲的内容是模板里的一个特殊概念——替换失败非错(substitution failure is not an error),英文简称为 SFINAE。原创 2023-04-24 11:12:08 · 268 阅读 · 0 评论 -
现代C++编程实战13-编译期能做些什么?一个完整的计算世界
你好,我是吴咏炜。上一讲我们简单介绍了模板的基本用法及其在泛型编程中的应用。这一讲我们来看一下模板的另外一种重要用途——编译期计算,也称作“模板元编程”。原创 2023-04-24 11:10:38 · 384 阅读 · 0 评论 -
现代C++编程实战12-编译期多态:泛型编程和模板入门
while (b!b = r;return a;这里只有一个小小的问题,C++ 的整数类型可不止int一种啊。while (b!b = r;return a;这个代码里,基本上就是把int替换成了模板参数E,并在函数的开头添加了模板的声明。可以通过常量0来构造可以拷贝(构造和赋值)可以作不等于的比较可以进行取余数的操作对于标准的intlonglong long。原创 2023-04-24 11:01:29 · 170 阅读 · 0 评论 -
现代C++编程实战11-Unicode:进入多文字支持的世界
Unicode 在今天已经大大超出了最初的目标。到 Unicode 12.1 为止,Unicode 已经包含了 137,994 个字符,囊括所有主要语言(使用中的和已经不再使用的),并包含了表情符号、数学符号等各种特殊字符。仍然要指出一下,Unicode 字符是根据含义来区分的,而非根据字形。除了前面提到过中日韩汉字没有分开,像斜体(italics)、小大写字母(small caps)等排版效果在 Unicode 里也没有独立的对应。原创 2023-04-24 10:59:16 · 633 阅读 · 0 评论 -
现代C++编程实战10-到底应不应该返回对象?
你好,我是吴咏炜。前几讲里我们已经约略地提到了返回对象的问题,本讲里我们进一步展开这个话题,把返回对象这个问题讲深讲透。原创 2023-04-24 10:46:53 · 172 阅读 · 0 评论 -
现代C++编程实战08-易用性改进I:自动类型推断和初始化
你好,我是吴咏炜。在之前的几讲里,我们已经多多少少接触到了一些 C++11 以来增加的新特性。下面的两讲,我会重点讲一下现代 C++(C++11/14/17)带来的易用性改进。就像我们中说的,我们主要是介绍 C++ 里好用的特性,而非让你死记规则。因此,这里讲到的内容,有时是一种简化的说法。对于日常使用,本讲介绍的应该能满足大部分的需求。对于复杂用法和边角情况,你可能还是需要查阅参考资料里的明细规则。原创 2023-04-23 09:27:37 · 101 阅读 · 0 评论