打造优雅的 C++ 跨平台开发与构建 Workflow
C++ 的构建问题一直是热门话题,尤其在各种语言论战中,常常被当作反面教材。有趣的是,大多数 C++ 程序员往往是参与到现有系统的维护中,面对的是高度固化、无法改动的构建流程,真正需要从零搭建项目的人反倒是少数。 ...
C++ 的构建问题一直是热门话题,尤其在各种语言论战中,常常被当作反面教材。有趣的是,大多数 C++ 程序员往往是参与到现有系统的维护中,面对的是高度固化、无法改动的构建流程,真正需要从零搭建项目的人反倒是少数。 ...
Why do we need AOT for CuTe DSL? CUTLASS C++ 是一个用来编写高性能 CUDA 算子的库,以复杂难学著称。为了降低学习成本,NVIDIA 推出了基于 Python 的 CuTe DSL。使用 Python 而不是 C++ 模板来进行元编程具有很多好处,首先就是用户不必和 C++ 那些晦涩难懂的模板报错作斗争了,这对于 C++ 初学者来说是非常头疼的一件事情,现在他们可以专注于代码逻辑。另外,nvcc 编译很慢,而其中大部分时间是花在编译器前端,也就是解析 C++ 代码上。尤其是对于 CUTLASS 这样 template heavy 的库,主要的时间都花在处理模板实例化上了,使用 CuTe DSL 可以绕过这个问题。相比于使用 CUTLASS 的 C++ 代码,它编译的速度能提升几十甚至上百倍。除此之外,现在算子和单测都可以一起在 Python 里写了,也方便了很多。 ...
昨晚买下了 clice.io 这个域名,并且在它上面部署了 clice 的文档网站,心底有一种难以言喻的喜悦。一方面是我真的很喜欢 clice.io 这个域名,看起来很精致漂亮。其实还有几个候选项,比如 .dev 等,最终还是选了相对较贵(一年 500)但看起来更好看的这个域名。另一方面,它代表着 clice 又进入了一个新的阶段。 ...
在昨天刚才结束的 C++26 Sofia 会议上,有关静态反射 (Static Reflection) 的七个提案: Reflection for C++26 Function Parameter Reflection Annotations for Reflection Splicing a base class subobject Expansion Statements definestatic{string,object,array} Error Handling in Reflection 全都通过了 plenary 得以被正式纳入 C++26 标准,这是一个令人激动的时刻。在我看来,静态反射无疑是 20 年来 C++ 最重要的一个新特性。它彻底改变了以前使用模板进行元编程的模式,让元编程 (meta programming) 的代码可以像普通的代码逻辑一样易于阅读、编写、使用,而不再是以前基于模板的 DSL。 ...
在上一篇关于 clice 的 文章 发布后,收到的反响远超我的预期,也有很多朋友说想要参与到开发中。有这份心是好的,但是参与进来的门槛却不低,主要难点就是在于和 Clang 的 API 进行交互。难在哪呢?一方面在于无论是中文还是英文社区,互联网上关于 Clang 的资料相对较少(这是预期的,因为相关的需求非常少,自然而然也就没什么人讨论了)。另一方面,由于 C++ 语言本身的复杂性,有很多细节需要对语言本身有较为深入的理解然后才能理解,把理论和实现联系起来也并不那么容易。 ...
距离上一次发布博客已经过去几个月了,之所以这么久没有更新呢,是因为我这段时间一直忙于 clice —— 一个全新的 C++ 语言服务器 (language server)。 ...
因为某些机缘巧合参与了上周的 WG21 会议(C++ 标准委员会会议)。虽然我经常浏览 C++ 标准的新提案,但是确实没想到有一天真的能参加 WG21 会议,实时了解 C++ 标准的最新进展。当然,这也是第一次参加,非常激动,在这里记录一下自己的感受和会议的进展。 ...
参加了 Google Summer of Code 2024,主要的任务就是为一个 Python 解释器 实现 pybind11 的兼容性接口。说是实现兼容性接口,实际上相当于重写 pybind11 了,所以最近一直在读它的源码。 ...
单例模式 (Singleton Pattern) 是一种常见的设计模式,往往应用于配置系统,日志系统,数据库连接池等需要确保对象唯一性的场景。但是单例模式真的能保证单例吗?如果唯一性得不到保证会产生什么后果呢? ...
Compiler Explorer 是一个非常流行的 C++ 在线编译器,可用于测试不同的编译执行环境,或者分享代码。作为一个 C++ 爱好者,我几乎每天都要和它打交道,使用频率之高远超我的想象。同时,我也是一个重度 VSCode 用户,几乎所有的事情都在 VSCode 中完成。考虑到经常在本地写代码然后拷贝到 Compiler Explorer 上去,总觉得不太舒服,有时候直接就在它的网页编辑器上改了,但是又没有代码补全,也不舒服。所以我和 @iiirhe 合作编写了这个插件 Compiler Explorer for VSCode,基于 Compiler Explorer 提供的 API 将 Compiler Explorer 集成到 VSCode 中,使得用户可以在 VSCode 中直接使用 Compiler Explorer 的功能。 ...
Application Binary Interface,也就是我们常说的 ABI,是个让人感觉到既熟悉又陌生的概念。熟悉在哪里?讨论问题的时候经常会讨论到它,看文章的时候经常会提到它,有时候又要处理它导致的兼容性。陌生在哪里?如果有人问你什么是 ABI,你会发现你知道它是怎么一回事,但是要用严谨的语言去描述它有些困难。最后只好照着 WIKI 说:ABI 就是两个二进制程序模块之间的接口。有问题吗?没有问题,作为一个概括性的描述,已经足够了。但是让人感觉到有些空洞。 ...
相信读者经常能听见有人说 C++ 代码二进制膨胀严重,但是一般很少会有人指出具体的原因。在网络上一番搜索过后,发现深入讨论这个问题的文章并不多。上面那句话更像是八股文的一部分,被口口相传,但是没什么人能说出个所以然。今天小编 ykiko 就带大家一起来探秘 C++ 代码膨胀那些事 (^ω^) ...
前情提要:The History of constexpr in C++! (Part One) 2015-2016:模板的语法糖 在 C++ 中支持 全特化 (full specialization) 的模板很多,但是支持 偏特化 (partial specialization) 的模板并不多,事实上其实只有类模板 (class template) 和变量模板 (variable template) 两种支持,而变量模板其实可以看做类模板的语法糖,四舍五入一下其实只有类模板支持偏特化。不支持偏特化会导致有些代码十分难写 ...
几个月前,我写了一篇介绍 C++ 模板的文章:雾里看花:真正意义上的理解 C++ 模板。 理清了现代 C++ 中模板的地位。其中用 constexpr function 替代模板进行编译期计算可以说是现代 C++ 最重要的改进之一了。 constexpr 本身其实并不难以理解,非常直观。但是由于几乎每个 C++ 版本都在改进它,所以不同的 C++ 版本可以使用的内容差别很大,有时候可能给人一种 inconsistency 的感觉。 ...
no hard code 定义一个 enum enum Color { RED, GREEN, BLUE }; 尝试打印 Color color = RED; std::cout << color << std::endl; // output => 0 如果需要枚举作为日志输出,我们不希望在查看日志的时候,还要人工去根据枚举值去查找对应的字符串,麻烦并且不直观。我们希望直接输出枚举值对应的字符串,比如 RED,GREEN,BLUE。 ...
众所周知,现在 C++ 里面有两种特殊的构造函数,即 copy constructor 和 move constructor copy constructor 早在 C++98 的时候就加入了,用来拷贝一个对象,像 vector 这种拥有资源的类型,拷贝的时候会把它拥有的资源也拷贝一份 ...
Introduction 在 C++17 中引入了叫做「结构化绑定」的特性也就是 Struct Binding,这一特性类似于别的语言中的模式匹配,可以让我们方便的对结构体的成员进行访问 ...
静态与动态 静态类型和动态类型这两个词语相信大家都不陌生了,区分二者的关键在于类型检查的时机。什么意思呢? ...
首先什么是元信息? 来看下面一段 python 代码,我们希望能够根据传入的字符串来自动修改对应的字段值 ...
Clang 是 LLVM 项目提供的一个 C 语言家族的编译器前端。它最初开发的目的是替代 GNU Compiler Collection (GCC) 的 C 语言前端,目标是提供更快的编译速度、更好的诊断信息和更灵活的架构。Clang 包含一个 C、C++ 和 Objective-C 编译器前端,这些前端设计为可以嵌入到其他项目中。Clang 的一个重要特点是其模块化架构,使开发者能够更轻松地扩展和定制编译器的功能。Clang 被广泛应用于许多项目,包括 LLVM 自身、一些操作系统内核的开发以及一些编程语言的编译器实现。 ...
引入 刚好拿最近的一个需求作为引入吧。我们都知道 markdown 可以用 lang 来填入代码块,并支持代码高亮。可是我想支持自己定义的代码高亮规则,遇到了如下问题: ...
What is Reflection? 反射 (Reflection) 这个词相信大家都不陌生了,也许你没用过但是你一定听过。然而,就像 CS 领域很多其他的惯用词一样,对于反射,并没有一个清晰而准确的定义。于是就会出现这种情况:对于 C#, Java, Python 这些拥有反射的语言,谈论到反射可以很自然的联想到对应语言中相关的设施,API 和代码示例,非常的具体。而对于 C, C++, Rust 这些没有反射的语言,当谈论起反射的时候,大家都不确定对方指的是什么,非常的不具体。比如有人告诉我说 Rust 有反射,他给出的例子是 Rust 的官方的文档中对 std::Any 模块 的介绍。里面提到了 ...
最近打算写一个系列文章详细讨论反射(reflection)这一概念,刚好 C++26 有了新的反射提案,发现知乎上又没有相关的文章,而这个话题又经常被讨论。所以借此机会来聊一聊属于 C++ 的静态反射(static reflection),作为系列预热了。 ...
Introduction 在 C++ 中,形如 &T::name 的表达式返回的结果就是成员指针。写代码的时候偶尔会用到,但是这个概念可能很多人都并不熟悉。考虑如下代码 ...
在 C++ 中,模板(Template)这个概念已经存在二十多年了。作为 C++ 最重要的一个语言构成之一,相关的讨论数不胜数。很可惜的是,深入有价值的讨论很少,尤其是以多个视角来看待这个特性。很多文章在谈论模板的时候往往会把它和各种语法细节缠绕在一起,容易给人一种云里雾里的感觉。类似的例子还发生在其他话题上面,比如介绍协程就和各种 IO 混在一起谈,谈到反射似乎就限定了 Java,C# 中的反射。这样做并不无道理,但是往往让人感觉抓不到本质。看了很多内容,但却不得其要领,反倒容易把不同的概念混淆在一起。 ...
上一篇 文章 我们初步了解了 STMP 的原理,并且利用它实现了简单的一个编译期的计数器。然而,它的威力远不止如此,这篇文章就来讨论一些基于 STMP 的高级应用。 ...
众所周知,传统的 C++ 的常量表达式求值既不依赖也不改变程序全局的状态。对于任意相同的输入,它的输出结果总是相同的,被认为是纯函数式 (purely functional) 的。模板元编程 (Template Meta Programming) 作为常量求值的一个子集,也应该遵守这个规则。 ...
std::variant 于 C++17 加入标准库,本文将讨论其加入标准的背景,以及一些使用上的问题。 ...