C++技法:模板元编程编译期获取类成员数量
C++反射中,有个必要的就是需要获取一个类的成员个数,然后就可以根据个数,将类的成员通过std::tie转换成tuple。继而可以实现equal、hash、serialize等功能。
C++反射中,有个必要的就是需要获取一个类的成员个数,然后就可以根据个数,将类的成员通过std::tie转换成tuple。继而可以实现equal、hash、serialize等功能。
在阅读Candle(rust的机器学习库)时,看到了rust中利用mmap和Cow机制实现零拷贝反序列化加载模型的tensor。
其中为了解决mmap的数据生命周期为’a, 如果用Cow<’a>引用mmap返回的指针, 使用的生命周期如果超过’a则不能使用,不利于代码开发和引用。因此引入了yoke crate擦除生命周期。
借此,搜索了一下c++的零拷贝反序列化库,找到了cista。
这个group
结构体是Swiss Table实现中的核心组件,用于高效处理哈希表控制位的批量操作。
可以中cista库的介绍中看到如下内容:
Comes with a serializable high-performance hash map and hash set implementation based on Google’s Swiss Table technique.
swiss table的实现可以参考简单了解下最近正火的SwissTable,讲解的很清晰。
以三种实现hashmap的方式,看优缺点:
链表法:指针稳定性,能采取扩容之外的手段阻止查询性能退化,比如把过长链表转换成搜索树。缺点:缓存不够友好,冲突较多的时候缓存命中率较低从而影响性能。
线性探测法:缓存友好,加上冲突会有连锁影响,没有指针稳定性。
在设计一个类时,类的成员就固定下来了。但是某些场景下,需要扩展类的成员,但是又不想改变类的定义。这种情况怎么办呢?
Linux从符号劫持到运行时追踪:函数Hook(LD_PRELOAD)、审计流劫持(LD_AUDIT)及函数插桩。
LTO(链接时优化)背后的基本原理是,将 LLVM 的一些优化过程推迟到链接阶段。为什么是链接阶段呢?因为在编译流程中,链接阶段是整个程序(即整套编译单元)能够一次性全部获取的时刻,因此跨编译单元边界的优化成为可能。
C++ has indeed become too “expert friendly” – Bjarne Stroustrup
Bjarne Stroustrup 的说得很对,因为专家们对 C++语言中的惯用法非常熟悉。随着程序员理解的惯用法的增加,该语言对他们来说变得更加友好。 这篇文章介绍的“Base-from-Member”就是 c++中的一种惯用法(idioms)。通过掌握现代 C++ 惯用法,提升这方面的知识,C++对我们来说就更加友好。
“Base-from-Member”技法的目的是,解决 C++在继承中,如何初始化一个依赖派生类(子类)成员变量的基类。
Deepseek开源了一系列AI infra的相关的项目,其中包括了deepseek-ai/3FS。
A high-performance distributed file system designed to address the challenges of AI training and inference workloads.
文件系统是任何操作系统的支柱,负责管理数据的存储和检索方式。传统上,开发文件系统是一项复杂而艰巨的任务,需要对内核编程有深入的了解。然而,有了 FUSE(用户空间文件系统),这项任务变得更加容易和通用。
在讨论 mix-in 是什么之前,我们先看它试图解决什么问题?
假设你在开发一款程序的过程中,有一堆想法或概念要建模。它们可能在某种程度上相关,但在很大程度上是正交的——这意味着它们可以独立存在。 你有以下方式选择: