- 博客(212)
- 资源 (11)
- 收藏
- 关注
原创 C++ 的 trivially relocatable
移动构造也是有开销的,并且对象移动之后,源对象依然是合法状态,它还需要析构,在一些情况下,这样标准的移动操作完全没必要。存在比移动更快的方式,那就是按位复制,只需将对象的数据复制到另一个地方,就可以在那个地方“还原”出这个对象,这可比普通的移动更有吸引力。
2025-04-25 11:41:41
982
原创 C++ 17 带初始化的 if 和 switch 语法
将初始化和条件判断写在一行代码中,用更少的代码实现更多的语义,可以使代码看起来更简短,也能更好地控制变量作用域
2025-04-25 11:40:44
448
原创 C++ 的 if-constexpr
if-constexpr 语法是 C++ 17 引入的新语法特性,也被称为常量 if 表达式或静态 if(static if)。引入这个语言特性的目的是将 C++ 在编译期计算和求值的能力进一步扩展,更方便地实现编译期的分支选择动作。
2025-03-24 11:21:11
1443
原创 C++ override 说明符
override和final作为说明符号,并不是保留的 C++ 关键字,它们只在它们能起作用的地方起说明作用,如果在其他地方出现,它们和普通的符号没有区别
2025-03-18 10:31:28
342
原创 C++ 11 的返回值类型后置语法
C++ 11 引入了一种新的语法形式,就是返回值类型后置(trailing-return-type)语法,也被称为跟踪返回值类型语法或后置返回值类型。
2025-03-14 11:28:34
798
原创 C++ 的位域(BitFields)
位域的定义使用 struct 关键字,但是和定义 struct 不同的是,它需要为每个分量(属性)指定长度,但是每个分量可以和数据结构中其他正常的元素一样使用和初始化。
2025-03-12 09:37:11
1090
原创 C++ 的时间库之八:format 与格式化
在《C++ 的时间库之五:time_point》和《C++ 的时间库之三:Duration》两篇文章中,我们增补了关于字符串格式化输入和输出的内容,但是因为篇幅关系,没有展开详细介绍相关的格式支持,所以本篇的目的就是全面介绍 format 库对时间库的格式化支持。
2025-03-10 09:50:28
1014
原创 C++ 的时间库之六:日历和时区
C++ 11 的时间库提供了各种时钟、时间点以及时间间隔的计算与表达,但是却没有提供日期相关的类型,也没有提供与时区有关的本地时间转换等支持组件,所以用起来不是很顺手。直到 C++ 20 终于补齐了这块短板,时间库具备是时间、日期和时区的完整支持
2025-02-27 10:38:41
842
原创 C++ 的时间库之五:time_point
C++ 的时间点有两个关键标识,一个是时间点计时用的时钟类型,另一个是记录时间点从时钟的纪元起点开始的时间间隔类型。时钟类型决定了时间点的计时方式和时间纪元起点,时间间隔类型决定这个时间点的计时单元是毫秒还是天。
2025-02-26 09:28:12
975
原创 C++ 的时间库之四:Clock
除了时间纪元的起点不同,不同的系统内时间间隔的计数精度也不一样,这就造成了计算机系统中时间记录方式的差异。为了区分这种差异,C++ 11 开始引入了系统时钟类型的概念,不同的时钟,对时间的理解和计算也不一样。
2025-02-25 10:43:39
612
原创 C++ 的时间库之三:Duration
C++ 的时间库主要有三部分组成,分别是时钟类型、时间点和时间间隔。时钟类型决定了计时方式,时间纪元的起点,时间间隔用于记录一段持续时间的长短,时间点是一种时钟类型在某个时间点的计数。时间间隔与时钟类型无关,也相对简单,所以先介绍一下时间间隔。
2025-02-24 10:37:01
667
原创 C++ 的时间库之二:Ratio
从现在开始,我们开始介绍 C++ 风格的时间处理,在这之前,首先要介绍 std::ratio。因为 C++ 的 `chrono`库中的时间段(duration)定义离不开ratio,不了解 ratio,就很难理解duration 的定义。
2025-02-18 11:21:13
893
原创 C++ 的时间库之一:C 语言传统
在 C++ 11 标准之前,C++ 的代码在处理跟时间有关的内容时,沿用的是 C 语言的库。C++ 11 引入了 chrono 库,经过 C++ 17 和 C++ 20 的补充,现在的 chrono 库已经完善。但是在介绍 C++ 的 chrono 库之前,了解一下 C 语言的时间处理方法是十分必要
2025-02-14 13:55:51
1983
原创 C++ 的 visit 函数
std::visit() 函数是 C++17 引入的一个得力工具,它可以让你针对一个 std::variant 的当前活动类型调用与之匹配的函数,换言之,它可以基于 std::variant 的实际活动类型完成一些函数分派(Dispatch)动作
2025-02-11 13:16:36
1535
原创 C++ 17 的 std::byte 类型
在大多数平台上,字节(也被称为 8 位组),是计算机程序存储数据的基本单位。但是不幸的是,C++ 一直没有字节类型。有人会问 char 不是吗?char 还真不是,它是一个字符类型,在 C++ 的世界里一直被认为是整型数的一种,只是在大多数系统中恰好也是 8 个比特位而已。
2025-02-10 14:51:53
1066
原创 C++ 23 的栈踪迹库(stacktrace)
许多编程语言都提供调用栈踪迹回溯的功能,在错误发生的时候,除了报告错误发生的位置,还能输出函数调用栈信息。现在,C++ 也有自己的栈踪迹库了
2025-02-08 16:35:27
1086
原创 C++ 的 CTAD 与推断指示(Deduction Guides)
类模板参数推导(Class Template Argument Deduction),C++ 20 对聚合类型的支持以及显示推断指示
2025-01-16 15:27:07
1102
原创 C++ 的 error_code 之三:自定义 error_condition
以访问被拒绝错误为例,Windows 系统上的设备驱动会返回 0xC0000005,而 Linux 系统上的设备驱动会返回 13。支持库要求同时支持两种操作系统,希望提供一种与设备无关的错误码定义,让支持库不需要根据操作系统的差异用两套代码判断错误码,这种情况就需要使用自定义的 error_condition。
2025-01-03 09:32:50
944
原创 C++ 的 error_code 之二:自定义 error_code
回答第一部分遗留的问题,std::errc 枚举值怎么就成了 error_condition 常量?上面这行代码背后是什么原理呢?
2025-01-02 10:47:37
690
原创 C++ 的 format_to 和 format_to_n 函数
std::format_to() 和 std::format_to_n() 则提供了对应的迭代器版本
2024-12-31 10:31:58
532
原创 C++ 的 error_code 之一:基本概念
有一些人将错误码机制和异常处理机制对立起来,认为是两种互斥的错误处理逻辑,其实这是不对的。首先,并不是所有的错误都是异常或以异常的形式出现,其次,异常中的错误信息也可以用错误码来表示。所以使用错误码和使用异常并不矛盾
2024-12-30 11:05:08
1032
原创 C++ 的 source_location
__FILE__ 和 __LINE__ 在输出日志和调试信息方面扮演重要的角色,现在,C++ 有了 source_location,提供更好的编程体验。
2024-12-27 11:15:18
705
原创 C++ 23 的 print 和 println
你肯定已经厌倦了 C++ 裹脚布般冗长的流式输出控制,但是又对 C 的 printf 的“安全性”心存芥蒂,每当需要格式化输出一些东西的时候,就有种百爪挠心的感觉。现在,不用再挠了,C++ 终于有自己的 print() 函数了。
2024-12-27 11:04:40
1181
原创 C++ 的 format 函数支持自定义类型
format() 对各种数据类型的格式化支持是通过提供 std::formatter 特化版本实现的,扩展 std::formatter 的方法有两种,一种是通过继承方式,从已经存在的 std::formatter 版本派生新的 std::formatter 特化类,另一种是实现一个完整的 std::formatter 特化版本
2024-12-27 11:01:03
1230
原创 C++ 的衰退复制(decay-copy)
要理解为什么 C++ 会有衰退复制(decay-copy)这个需求,需要了解一下 LWG issue 929 问题的提出,但是要理解这个 issue,最好先复习一下 C++ 模板参数的推导规则。
2024-12-25 12:03:34
1517
原创 C++ 基于范围的 for 循环与版本演化
介绍基于范围的 for 循环语法糖从 C++ 11 到 26 的演化,以及如何让自定义对象也支持基于范围的 for 循环
2024-12-20 15:34:10
773
原创 C++ 的 format 和 vformat 函数
介绍 C++ 20 引入的 format 和 vformat 函数,以及 C++ 23 和 26 的持续改进内容
2024-12-18 12:45:47
1671
原创 C++ 的“结构化绑定(Structured Binding)”
C++ 引入了 std::pair 和 std::tuple,可以很方便地定义一些轻量化的数据类型。但是 std::pair 和 std::tuple 的使用也引入了一些问题,最主要的就是代码可读性的下降
2024-10-21 10:37:25
607
原创 C++ 11 的 codecvt 与编码转换
乱码,是程序员最头疼的事儿,处理不同系统的文件,或者使用不兼容的第三方库,只要是程序规模大一点,几乎都会遇到乱码问题。乱码说白了,就是编码与解码不匹配,既然不匹配那就得做编码转换,本文就来聊聊编码转换这点事儿。
2024-10-16 11:19:34
915
原创 C++ 的僵尸标识符(Zombie identifiers)(截止 C++23)
C++ 11 开始引入大量新的语言特性,同时大量旧的内容被淘汰。C++ 版本迭代如此之快,以至于有些内容都还没有见过就已经被淘汰了。正所谓步子迈的太大容易那个什么的,以至于出现了 C++ 11 才引入的内容就在 C++ 17 被删除这样“惨绝人寰”的事情
2024-10-15 10:19:47
642
原创 C++ 的存储类型与新的 thread_local
存储周期只是一个概念,是程序语义范畴内的东西,但不是语法的范畴。存储类型说明符也被称为存储类型,它们是变量声明语法中类型说明符的一部分,它们和变量名的范围一起控制变量的两个独立属性,即存储周期和链接属性。
2024-10-14 12:36:47
759
原创 C++ 的用户自定义字面量
C++ 支持用户自定义的字面量标识符,允许用户对整数、浮点数、字符和字符串类型的立即数提供针对用户自定义对象的字面量后缀。
2024-10-12 11:39:23
937
原创 C++ 的字面量(literal)
终于,C++ 23 决定增加一种针对 std::size_t 的字面量,整数型的立即数后加上 z 或 Z 后缀就可以标识是有符号的 std::size_t 类型字面量
2024-10-11 11:52:08
1066
原创 算法系列之十二:多边形区域填充算法--扫描线填充算法(有序边表法)
二、扫描线算法(Scan-Line Filling) 扫描线算法适合对矢量图形进行区域填充,只需要直到多边形区域的几何位置,不需要指定种子点,适合计算机自动进行图形处理的场合使用,比如电脑游戏和三维CAD软件的渲染等等。 对矢量多边形区域填充,算法核心还是求交。《计算几何与图形学有关的几种常用算法》一文给出了判断点与多边形关系的算法――扫描交点的奇偶数判断算法,利用此算
2024-10-10 16:38:47
1563
1
原创 算法系列之二十三:离散傅立叶变换之音频播放与频谱显示
频谱和均衡器,几乎是媒体播放程序的必备物件,没有这两个功能的媒体播放程序会被认为不够专业,现在主流的播放器都具备这两个功能,foobar 2000的十八段均衡器就曾经让很多人着迷。我用Winamp播放音乐(AOL已经在2013年12月20日停止了Winamp的支持),最早吸引我的原因就是播放界面上那个跳动的频谱,如图(1)所示。我一直想搞清楚这个实现原理是什么,直到我知道有离散傅立叶变换这个东西存
2024-10-10 16:34:46
1027
1
翻译 有保证的复制消除(Guaranteed Copy Elision)
新的 C++ 17 标准带来了很多令人兴奋的新特性,其中一个微小的,不易觉察的改进就是“有保证的复制消除(guaranteed copy elision)”。
2022-06-02 10:10:42
1349
使用 dlib 库的人脸检测识别代码(C++)
2024-05-31
基于 webview2 的 duilib 插件,显示炫酷的罗盘钟
2024-05-30
thunderbird 2_0_0_16 中文语言包
2008-09-06
firefox 3_0_1 中文语言包
2008-09-06
Google Breakpad 源代码
2008-09-06
Herb Sutter - Conversation 经典对话系列
2008-09-06
用Visual Studio 2005编译Firefox所需要的补丁
2008-08-18
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人