C and C++ prioritize performance over correctness (2023)a year agohttps://research.swtch.com/ubC和C++将性能置于正确性之上,这会导致未定义行为,可能意外破坏程序。典型例子包括未初始化变量、算术溢出、无限循环和空指针使用——编译器会基于未定义行为假设进行优化。尽管存在正确性隐患,C++标准委员会仍拒绝明确定义有符号整数溢出等行为,以保留优化空间。C/C++的未定义行为已从可移植性问题转变为优化手段,这显著影响了可调试性和程序正确性。C/C++在性能与正确性之间的取舍非常明确:即使牺牲程序稳定性和安全性,性能也往往被优先考虑。
Growing Buffers to Avoid Copying Dataa year agohttps://johnnysswlab.com/growing-buffers-to-avoid-copying-data/Johnny’s Software Lab LLC 专注于软件性能优化。避免数据复制对性能至关重要,尤其是在C++和操作系统环境中。C++缺乏内置的realloc函数,这使得在不复制数据的情况下调整缓冲区大小变得复杂。提出的resize_buffer函数可能有助于避免C++中不必要的数据复制。Linux使用mmap和mremap进行内存分配和调整大小,需要谨慎管理地址。Windows没有mremap,但可以使用VirtualAlloc实现类似功能,尽管需要更多手动管理。jemalloc提供了xallocx用于缓冲区调整大小,这是标准C库中不具备的功能。实验表明,在调整缓冲区大小时避免数据复制可以显著提高性能。潜在问题包括系统特定行为、静默失败和虚拟内存碎片化。尽管存在挑战,但在某些场景下避免数据复制对性能是有益的。
Show HN: Hexi – Modern header-only network binary serialisation for C++a year agohttps://github.com/EmberEmu/HexiHexi是一个轻量级、仅头文件的C++23库,用于安全处理二进制数据(主要来自网络源)支持DNS、STUN、NAT端口映射协议等协议,注重易用性、安全性和最小开销Hexi不提供版本控制、格式转换或基于文本的格式处理功能采用MIT和Apache License 2.0双重许可,允许灵活使用通过复制hexi.h或使用CMake可轻松集成到项目中核心类:buffer_adaptor(容器包装器)和binary_stream(处理读/写操作)通过异常或no_throw机制支持边界检查和错误处理(零运行时开销)使用hexi::endian处理字节序,实现可移植数据序列化通过null_terminated等适配器安全处理字符串序列化提供额外组件如file_buffer、static_buffer和dynamic_buffer满足多样化需求支持写入定位、通过put/get精细控制,以及零拷贝视图访问缓冲区数据
Taming the UB Monsters in C++a year agohttps://herbsutter.com/2025/03/30/crate-training-tiamat-un-calling-cthulhutaming...C++社区正积极致力于强化和保障C++软件安全,重点关注未定义行为(UB)以提升安全防护能力。自C++11起,constexpr编译时代码已消除未定义行为,确保编译时求值的安全性。C++26引入多项改进,如消除未初始化变量的UB及边界强化标准库操作,显著增强安全性。社区正系统性地分类处理C++中的UB问题,采用错误行为规范、特性配置和契约编程等工具。计划发布白皮书系统记录并缓解C++语言UB问题,力求在安全漏洞方面比肩其他现代语言。新提案旨在消除可被远程代码执行(RCE)利用的UB,大幅提升C++软件安全性。该方案在保持C++性能与控制力的同时,允许在需要极致性能的场景进行选择性豁免。采用门槛设计极低,多数改进仅需重新编译,最大限度减少代码修改量。C++标准委员会将安全性作为优先事项,应对日益严峻的网络威胁,力争实现重大安全突破。
Msgpack23 – A modern, header-only C++ library for MessagePack (de)serializationa year agohttps://github.com/rwindegger/msgpack23msgpack23 是一个现代化的、仅头文件的 C++ 库,用于 MessagePack 序列化与反序列化面向 C++20 及以上标准,利用模板和类型特征实现灵活性仅需头文件,无需额外构建步骤或依赖项支持 STL 容器、映射、枚举、时间点及用户自定义类型可通过自定义 pack/unpack 成员函数进行扩展通过 std::endian 和 std::byteswap 实现字节序感知,确保可移植性包含对各种基本类型和 std::chrono::time_point 的支持集成简单:克隆仓库后包含头文件即可提供了 std::map 打包/解包的示例通过 MyData 结构体演示了自定义类型序列化专注性能,实现最小化开销和编译时类型推导采用 MIT 许可,开放贡献
My Favorite C++ Pattern: X Macros (2023)a year agohttps://danilafe.com/blog/chapel_x_macros/文章介绍了'X宏'模式——一种在C++中生成重复代码以提升可维护性并减少样板代码的方法。应用场景1:字符串驻留 - 展示如何通过X宏自动声明并初始化Chapel编译器中超过100个独特字符串,既提升效率又减少人工错误。应用场景2:AST类层次结构 - 演示X宏如何管理抽象语法树(AST)节点层级,包括生成动态类型转换的枚举标签,以及无需双重分派实现访问者模式。应用场景3:CPython方法表与访问器 - 阐释X宏在生成Python绑定的方法表和访问器中的应用,简化新方法添加流程并确保一致性。文章探讨了X宏模式的优势(如声明式可读性和减少样板代码),同时也指出其缺点,包括宏的过度使用和编译依赖增加等问题。
Using Token Sequences to Iterate Rangesa year agohttps://brevzin.github.io/c++/2025/04/03/token-sequence-for/文章讨论了C++ Ranges中的效率问题,特别是像filter和take_while这样的视图会执行冗余操作。提出了两种解决方案:提供内部迭代以获得更好性能的Flux库,以及一种利用令牌序列进行代码注入的理论方法。Flux展示了内部迭代如何通过避免冗余检查和优化空间使用来减少开销。令牌序列方法(仍在设计中)允许动态生成最优循环结构,展现了零开销抽象的潜力。示例突出了常见范围操作的性能问题,以及替代方案如何缓解这些问题。文章最后思考了C++ Ranges的未来方向,包括可能支持内部迭代的语言和库增强功能。
Show HN: HNSW index for vector embeddings in approx 500 LOCa year agohttps://github.com/dicroce/hnswHNSW是一种具有层级结构的图,顶部节点稀疏,底部节点密集。同一层级中的节点会与邻近节点相连接。插入操作会随机选择一个层级,并在该层级及以下所有层级中添加节点。搜索从顶层开始,逐层向下,并跟踪K个最近邻节点。该实现是一个仅需单头文件的现代C++库,代码量约500行。它使用Eigen进行SIMD加速以提升距离计算速度。典型用法包括创建索引、添加向量以及搜索最近邻节点。
Boost 1.88.0a year agohttps://www.boost.org/users/history/version_1_88_0.htmlBoost 1.88.0 版本于2025年4月10日发布。新库:未提及新增库。更新的库:Array、Asio、Assert、Beast、Conversion、DLL、Geometry、Graph、Iterator、Lockfree、Log、Mp11、MySQL、PolyCollection、SmartPtr、Stacktrace、TypeIndex、Unordered、Variant2。关键改进:- Array:新增`noexcept`和`constexpr`支持,弃用过时函数,优化`array<T, 0>`的行为。- Asio:修复多个问题,改进文档,增加运行时配置选项。- DLL:代码现代化,减少依赖项,改进错误处理机制。- Graph:性能提升,修复错误,并采用C++14特性进行现代化改造。- Iterator:放弃C++03支持,新增类型特征,优化迭代器体积。- MySQL:改进连接池处理,新增功能,修复竞态条件问题。测试编译器:涵盖Clang、GCC和Visual C++等多款编译器,支持多种C++标准。致谢:Marshall Clow、Glen Fernandes和Ion Gaztañaga负责本次版本发布管理。
C++: terser (shorter) lambda == SHORTY (ab-use?)a year agohttps://github.com/hanickadot/shorty'shorty'库提供了比C++ lambda更简洁的语法,并非替代C++,而是为表达式编写提供更精炼的方式。示例包括用`$lhs > $rhs`进行排序、用`($i % 2) == 0`过滤偶数,以及对视图进行zip/transform操作。支持调用外部函数如`$<sqrt>($a * $a + $b * $b)`,以及用`$<int>($0)`进行类型转换。特殊参数语法包含`$lhs`、`$rhs`、`$it`、`$a`到`$f`、`$x`、`$y`、`$z`、`$i`、`$n`、`$k`、`$in`、`$argc`和`$args`。捕获选项:`$(v)`或`$ref(v)`表示引用捕获,`$value(v)`或`$copy(v)`表示值捕获,`$fixed<v>`或`$const<v>`用于CNTTP。支持通过`$<callable>(args...)`调用可调用对象,或通过`$call<CallableType>(args...)`构造新实例。支持算术运算如`$a += 2`及其他复合赋值操作。特别感谢一位匿名阿根廷人对此项目的启发。
Show HN: Single-Header Profiler for C++17a year agohttps://github.com/DmitriBogdanov/UTL/blob/master/docs/module_profiler.mdutl::profiler 是一个单文件头实现的轻量级性能分析工具,通过简单宏即可实现代码段耗时统计功能特性:支持作用域耗时测量、表达式耗时测量、代码片段分析,并自动生成调用关系图支持多线程分析、递归函数分析、CPU周期计数器时间戳,可在任意程序节点导出分析结果通过定义`UTL_PROFILER_DISABLE`宏可完全禁用性能分析功能提供丰富的样式配置选项:支持基于运行时长的缩进排版与色阶标记采用低开销设计,支持使用CPU周期计数器指令(rdtsc)进一步降低性能分析开销内存占用极简,通过`UTL_PROFILER_USE_SMALL_IDS`宏可使用更紧凑的ID格式节省内存线程安全API设计,仅在创建/销毁线程或手动上传结果时需要最小粒度的锁操作
Modern CMakea year agohttps://cliutils.gitlab.io/modern-cmake/README.html现代CMake(3.15+或4.0+版本)是解决构建系统问题的简洁、强大而优雅的方案像CMake这样优秀的构建系统对于避免硬编码路径、支持多操作系统/编译器/IDE、使用各类库和工具至关重要CMake因其在IDE和库中的广泛支持而成为首选构建系统设置过低的CMake最低版本可能导致警告或错误,文档中提供了推荐的最低版本要求现代CMake致力于纠正网络上流传的不良示例和优化实践方案学习现代CMake的额外资源包括:官方文档、技术演讲和专业指南
Raw Loops for Performance?a year agohttps://www.sandordargo.com/blog/2025/04/16/raw-loops-for-performance作者加入了一个新项目并开始进行小规模改进,包括用C++20 ranges替代原始循环对使用原始循环(配合`push_back`)和C++20 ranges(`std::ranges::transform`)进行数据转换的性能做了对比性能测试表明,使用`emplace_back`和`reserve`的原始循环比ranges更快,但ranges提供了更好的代码可读性作者总结认为虽然ranges可能稍慢,但在大多数实际场景中差异可以忽略,除非对性能有严格要求,否则应优先考虑代码可读性
C++ creator Bjarne Stroustrup reimagines how coding is taughta year agohttps://stanforddaily.com/2025/04/15/stroustrup-reimagines-coding-teaching/C++之父Bjarne Stroustrup探讨了C++的定位与编程教育存在的问题根据TIOBE指数,C++是全球第二大流行编程语言Stroustrup主张编程教育应更具多样性,批评'一刀切'的教学模式他建议通过缩减计算机专业招生规模来提升教育质量Stroustrup提出将课程划分为三类:非专业群体、科研人员、工程师/专家他批评现行编程教材过度强调语法而缺乏概念深度Stroustrup认为C++在硬件访问和性能优化方面具有独特优势斯坦福大学教授Chris Gregg称赞Stroustrup是编程语言领域的远见者Stroustrup创造C++旨在弥合高级编程与硬件效率之间的鸿沟他反对'语言之争',强调掌握多门语言是专业素养的体现
Show HN: Less Slow C++a year agohttps://github.com/ashvardanian/less_slow.cpp基准测试专注于C++中以性能为导向的软件设计。使用C++20特性,并针对Linux下的GCC和Clang进行了优化。涵盖从微内核到并行算法和协程等主题。亮点包括更快的三角函数计算、编译器优化和矩阵乘法。讨论GPU编程、CUDA以及CPU与GPU代码的区别。包含实际示例,如无需内存分配的JSON处理。推荐Linux环境设置以获得最佳兼容性。构建过程包括克隆仓库、安装依赖项和使用CMake编译。支持多种第三方库以增强功能。提供控制基准测试输出和筛选特定测试的标志。建议禁用SMT(同步多线程)以获得稳定的基准测试结果。包含手写汇编和PTX IR以实现硬件特定优化。浓缩了Google Benchmark功能列表,用于编写基准测试。
Pahole: Analysing Memory Layout of Complex Data Structures with Easea year agohttps://pramodkumbhar.com/2023/11/pahole-to-analyz-data-structure-memory-layouts...作者反思了自己在保持稳定写作习惯方面的进展,并介绍了用于检查C/C++数据结构内存布局的pahole工具。Pahole是dwarves工具套件的一部分,通过分析DWARF调试信息,帮助开发者理解内存布局、对齐和填充。该工具可通过重组数据结构来优化缓存效率、减少伪共享并提升性能。通过软件包管理器或源码安装pahole都很简便,其命令行选项支持多种详细分析功能。示例展示了pahole如何揭示数据结构中的填充、空洞和缓存行使用情况,以及如何重组数据以获得更高内存效率。该工具还能模拟不同缓存行大小的内存布局,并有效处理嵌套数据结构。作者感谢Arnaldo Carvalho de Melo开发了pahole,并表达了发现此类性能优化工具的兴奋之情。
Show HN: Woeful – let web apps safely and securely connect to external resourcesa year agohttps://github.com/MercuryWorkshop/WoefulWisp V1 支持Pcap 网络抓包功能端口与域名的黑白名单功能相比 WispServerCpp 性能更优采用 C++ 构建,建议谨慎选择 Rust 替代方案(如 Epoxy)鸣谢关键项目:uWebSockets、Cli11、pugixml、tl::expected、PcapPlusPlus、BS_thread_pool旨在打造高性能 Wisp 服务器以处理多样化流量描述 WispServerCpp 不稳定且存在缺陷,此版本为其改进版
I started a devblog about mixing SwiftUI and C++ to make a Twitch appa year agohttps://www.kulve.org/blog/tech_stackKulve是一款基于SwiftUI的应用程序,利用Swift 5.9引入的Swift/C++互操作功能技术栈包括CMake、Xcode、VSCode、Swift/SwiftUI和C++CMake用于独立的C++后端开发,确保跨平台兼容性尽管更偏好使用VSCode进行原始编辑,但Xcode仍用于SwiftUI界面编辑和构建系统VSCode配合clangd扩展进行后端C++开发,提供卓越的代码检查和自动补全功能Swift专门负责UI和框架搭建,而C++处理通用任务如线程和网络通信应用程序通过Swift/C++互操作实现聊天等功能,C++管理内存,Swift处理UI更新内存管理由C++负责,Swift封装原始指针以确保安全性和效率该设计确保Swift不持有内存所有权,从而避免内存泄漏并保持性能Kulve的创新方法允许通过指针高效地将大型数据结构嵌入UI元素本文重点介绍了为Kulve开发的独特解决方案,旨在为原生SwiftUI开发者提供参考和帮助
New C++ features in GCC 15a year agohttps://developers.redhat.com/articles/2025/04/24/new-c-features-gcc-15GCC 15.1预计将于2025年4月或5月发布GCC 15将成为Fedora 42的系统编译器,并通过Red Hat GCC工具集在RHEL中提供GCC 15的默认方言仍为-std=gnu++17,同时支持C++23和C++26特性选项GCC 15中的C++26特性包括包索引、结构化绑定的属性增强以及对删除函数的扩展支持包索引允许直接访问可变参数模板包中的元素现在可以将属性应用于结构化绑定删除函数现在支持通过=delete("原因")添加说明信息可变参数友元允许在友元声明中使用参数包C++26现在支持constexpr placement new操作结构化绑定现在可用于if和while等条件语句C++26中删除不完整类型的指针现在属于无效操作牛津式可变参数逗号用法(前置逗号省略)已被弃用数组比较在C++26中现属于非法操作C++26引入了用于包含二进制数据的#embed指令GCC 15已修复多个缺陷报告基于范围的for循环现在能正确延长临时对象的生命周期限定名称查找失败会在模板解析阶段更早被诊断已移除对Concepts TS的支持,需迁移至C++20概念新增编译器选项如-fassume-sane-operators-new-delete和-Wheader-guard改进了模板密集型代码的编译时速度新增flag_enum等属性及-Wself-move、-Wdefaulted-function-deleted等警告
GCC 15 is now available, with support for more draft C++26 featuresa year agohttps://isocpp.org//blog/2025/05/gcc-15-is-now-available-with-support-for-more-d...GCC 15已发布,实现了多项C++26新特性关键C++26特性包括:P2558R2(基础字符集扩展)、P2552R3(标准属性)、P2662R3(包索引)等改进了C++模块功能并提升了编译速度其他重要特性包含P1967R14(#embed指令)、P2865R5(移除废弃的数组比较)和P3247R2(弃用平凡类型)完整变更列表请参阅官方发布说明