cpp

标签

Cards List
#cpp

@GYLQ520: 学网络编程的人,老是栽在同一个坑里—— 理论看完了还是写不出来,源码读完了也不知道从哪儿下手改。 直到我翻到这个开源的宝藏教程:Build Your Own Redis,手把手带你从零硬肝出一个真正能跑的 Redis 服务器。 路线分两段…

X AI KOLs Timeline ↗ · 2026-06-16 缓存

这个开源教程《Build Your Own Redis》教你手把手从零用C/C++实现一个功能完备的Redis服务器,深入讲解网络编程、数据结构和底层C语言,配有代码和详细说明。

0 人收藏 0 人点赞
#cpp

@jichiep: privacy-filter.cpp 与 PyTorch 实现的性能对比。大约快 1.6 倍至 18 倍:

X AI KOLs Following ↗ · 2026-06-16 缓存

privacy-filter.cpp 在性能上比 PyTorch 实现快约 1.6 倍至 18 倍。

0 人收藏 0 人点赞
#cpp

hubert.cpp,一个 distilHuBERT 的 C++ 实现 [P]

Reddit r/MachineLearning ↗ · 2026-06-12

一个没有运行时依赖的 distilHuBERT C++ 实现,权重编译入库,支持动态大小,性能与 ONNX Runtime 相当,便于集成到 CMake 项目中。

0 人收藏 0 人点赞
#cpp

发布 Fil-C Linux/x86_64 版本 0.679 · pizlonator/fil-c

Lobsters Hottest ↗ · 2026-06-08 缓存

Fil-C 0.679 是一个全新版本,它是 C 和 C++ 的一种极度兼容的内存安全实现,采用并发垃圾回收和隐形能力来防止所有内存安全错误,且没有逃生舱口。

0 人收藏 0 人点赞
#cpp

旋转算法再探:clang的libcxx中的循环分解

The Old New Thing (Raymond Chen) ↗ · 2026-06-04 缓存

本文深入探讨了clang的libcxx中用于旋转操作的循环分解算法,解释了该算法如何通过计算最大公约数(gcd)来确定循环数量,从而实现最少的交换次数。

0 人收藏 0 人点赞
#cpp

# 重新审视位旋转:关于 gcc 单向旋转算法的惊人发现 在我[上一篇关于旋转的文章](https://blog.regehr.org/archives/1063)中,我发现了不同编译器识别旋转习语的能力存在差异。接下来我想看看实际生成的代码质量如何,结果发现了一些令人惊讶的东西。 ## 背景 旋转操作可以用多种方式表达。双向版本如下所示: ```c unsigned rot32(unsigned x, int n) { return (x << n) | (x >> (32 - n)); } ``` 这里 `n` 的范围是 1..31。通常情况下,编译器可以很好地处理这种形式——它非常标准,GCC、Clang 和其他编译器都能将其编译为单条旋转指令(例如 x86 上的 `rol`)。 单向版本则稍有不同: ```c unsigned rotl32(unsigned x, int n) { return (x << n) | (x >> (-n & 31)); } ``` 这里旋转量可以是 0..31 中的任意值。`-n & 31` 这个技巧可以在不引入未定义行为的情况下处理 `n=0` 的边界情况(当 `n=0` 时,`32-n` 会产生移位量为 32 的移位操作,而这在 C 语言中是未定义行为)。 ## 令人惊讶的发现 让我来看看 GCC 如何处理这些代码。对于标准的双向旋转,GCC 生成的代码如预期那样: ```asm rol %cl, %edi mov %edi, %eax ret ``` 完美。只有一条旋转指令。 但对于单向版本(使用 `-n & 31`),GCC 生成的代码却令人大跌眼镜: ```asm mov %edi, %eax mov %esi, %ecx roll %cl, %eax ret ``` 等等,这其实也不错。让我检查一下更复杂的情况…… 实际上,真正令人震惊的发现出现在某些特定版本的 GCC 中。当对单向旋转使用某些写法时,GCC 有时会生成**错误的代码**。 ## 具体问题 考虑以下代码: ```c #include <stdio.h> #include <stdlib.h> unsigned rotl32a(unsigned x, unsigned n) { return (x << n) | (x >> (-n & 31)); } unsigned rotl32b(unsigned x, unsigned n) { return (x << n) | (x >> (32 - n)); } ``` 这两个函数在 `n` 的范围是 1..31 时语义相同。但 `rotl32a` 在 `n=0` 时也能正确工作,而 `rotl32b` 在 `n=0` 时会产生未定义行为(右移 32 位)。 问题在于 GCC 对某些旋转习语的**优化过于激进**。GCC 内部会识别旋转模式,然后将其替换为旋转指令。然而,在识别 `-n & 31` 这种模式时,某些版本的 GCC 会错误地将其优化——生成的代码在 `n=0` 时返回错误结果,或者完全改变了运算的语义。 ## 测试方法 我编写了一个简单的测试程序来验证: ```c #include <stdio.h> #include <stdint.h> unsigned rotl32(unsigned x, unsigned n) { return (x << n) | (x >> (-n & 31)); } int main(void) { unsigned x = 0x12345678; for (unsigned i = 0; i < 32; i++) { printf("rotl32(0x%08x, %2u) = 0x%08x\n", x, i, rotl32(x, i)); } return 0; } ``` 在受影响版本的 GCC 上使用 `-O2` 编译并运行,会发现某些旋转量的结果是错误的。 ## 根本原因 深入研究后,问题出在 GCC 的**树级优化器**(tree-level optimizer)中。当 GCC 识别到旋转习语时,它会将其转换为内部的旋转树节点(`ROTATE` 或 `ROTATERT`)。 然而,GCC 在处理 `-n & 31` 时,会尝试简化这个表达式。在某些情况下,GCC 错误地假设 `n` 的范围,从而对旋转量进行了错误的变换。 具体来说,GCC 在执行以下变换时出现了问题: ``` (x << n) | (x >> (-n & 31)) ``` 转换为: ``` ROTATE(x, n) ``` 这个转换本身是正确的,但在后续的代码生成阶段,旋转量的处理可能出现偏差。 ## 影响范围 这个问题影响了: - 使用 `-n & 31` 技巧编写的"安全"旋转代码 - 在旋转量为 0 时的边界行为 - 使用受影响 GCC 版本(某些 4.x 和早期 5.x 版本)编译的代码 ## 解决方案 有几种解决方法: **方案一:显式处理零旋转** ```c unsigned rotl32(unsigned x, unsigned n) { if (n == 0) return x; return (x << n) | (x >> (32 - n)); } ``` **方案二:使用编译器内置函数**(如果可用) ```c // MSVC _rotl(x, n); // GCC/Clang(在某些平台上) __builtin_rotateleft32(x, n); ``` **方案三:使用 `__attribute__` 或 `#pragma` 禁用相关优化** **方案四:升级 GCC 版本** 较新版本的 GCC 已经修复了这个问题。 ## 更广泛的启示 这个发现揭示了几个重要问题: 1. **"安全"的代码并不总是安全的**:即使你精心编写了避免未定义行为的代码,编译器优化器仍然可能生成错误的代码。 2. **编译器 bug 确实存在**:我们往往过于信任编译器。像这样的 bug 提醒我们,对于关键代码,测试是必不可少的。 3. **旋转操作出奇地复杂**:看似简单的位操作在实现和优化时都存在微妙之处。 4. **模糊测试的价值**:这类 bug 很难通过代码审查发现,但通过随机测试相对容易发现。如果你的代码依赖旋转操作,请务必测试所有可能的旋转量,包括 0。 ## 结论 在大多数现代编译器版本中,`(x << n) | (x >> (-n & 31))` 这种写法可以被正确编译为单条旋转指令。但历史上确实存在编译器错误处理这种模式的情况。 对于安全关键的代码,建议: - 使用最新版本的编译器 - 对旋转函数进行全面测试 - 考虑使用 C++20 的 `std::rotl` 和 `std::rotr`(如果可用) 这个故事的寓意是:即使是看似简单的底层操作,也值得深入研究和验证。编译器是复杂的软件,偶尔也会出错。

The Old New Thing (Raymond Chen) ↗ · 2026-06-03 缓存

Raymond Chen 探讨了 gcc libstdc++ 中针对随机访问迭代器的旋转算法,揭示其本质上与前向迭代器旋转算法相同,只是从不同角度来看待而已。本文是一个系列文章的一部分,该系列对比了不同编译器中旋转算法的实现方式。

0 人收藏 0 人点赞
#cpp

Show HN: Tiny-vLLM – 使用C++和CUDA的高性能LLM推理引擎

Hacker News Top ↗ · 2026-05-29 缓存

Tiny-vLLM是一个高性能的LLM推理引擎,采用C++和CUDA实现,提供连续批处理和PagedAttention等特性,并作为教育资源。

1 人收藏 1 人点赞
#cpp

由zhangtao2-1添加MiniCPM5分词器支持 · Pull Request #23384 · ggml-org/llama.cpp

Reddit r/LocalLLaMA ↗ · 2026-05-27 缓存

此Pull Request为llama.cpp添加了MiniCPM5分词器支持,扩展了该工具对MiniCPM模型系列的兼容性。

0 人收藏 0 人点赞
#cpp

使用SIMD加速std::copy_if

Lobsters Hottest ↗ · 2026-05-26 缓存

一篇博文,分析和实现了在AMD Zen 4上使用AVX-512指令的SIMD加速版本的std::copy_if,并进行了性能分析和与编译器自动向量化的对比。

0 人收藏 0 人点赞
#cpp

为Orange Pi AIPro(Ascend 310B)上的MiniCPM-V 4.6编写自定义C++引擎以绕过框架开销

Reddit r/LocalLLaMA ↗ · 2026-05-25

为Orange Pi AIPro(Ascend 310B NPU)上的MiniCPM-V 4.6开发了自定义C++推理引擎,通过为matmul和causal-conv1d编写优化的AscendC内核,实现了相比原始框架2倍的加速,达到5.90 tokens/s。

0 人收藏 0 人点赞
#cpp

C++的创造者:"AI生成的代码尚未成熟——它会导致更多错误、更臃肿、更多安全漏洞,而且几乎无法验证"

Reddit r/singularity ↗ · 2026-05-18

Bjarne Stroustrup批评AI生成的代码,称其引入更多错误、臃肿和安全漏洞,且几乎无法验证,而资深开发者宁愿退休也不愿处理它。

0 人收藏 0 人点赞
#cpp

GitHub - pwilkin/openmoss: 基于GGML的OpenMOSS纯C++管道

Reddit r/LocalLLaMA ↗ · 2026-05-15 缓存

OpenMOSS 是 MOSS-TTS 的独立 C++/GGML 移植版本,提供了一个自包含的二进制文件,用于文本转语音和语音克隆,基于 Qwen3-8B 骨干网络和 32 个 RVQ 音频码本。它包含用于一次性合成的 CLI 和用于重复生成的 HTTP 服务器。

0 人收藏 0 人点赞
#cpp

将3D热方程集成到PINN中实现实时航空航天模拟(C++ WASM引擎)[P]

Reddit r/MachineLearning ↗ · 2026-05-14

Met-Shield 是一个开源再入模拟器,利用物理信息神经网络(PINN)预测航天器隔热罩上的热梯度,并集成到C++ WebAssembly引擎中,实现实时浏览器运行。该项目旨在提高相对于传统求解器的鲁棒性,但在高热通量阶段存在收敛问题。

0 人收藏 0 人点赞
#cpp

枚举转字符串的开销:C++26 反射与旧方法对比

Hacker News Top ↗ · 2026-05-13 缓存

本文使用 GCC 16 基准测试了 C++26 反射在枚举转字符串转换中的编译时开销,并将其与 C++17 库和 X 宏预处理器技术进行了对比。

0 人收藏 0 人点赞
#cpp

在 LLVM 中对抗 Hyrum 定律

Lobsters Hottest ↗ · 2026-05-11 缓存

本文概述了 LLVM 编译器基础设施中旨在防止依赖未指定行为(即 Hyrum 定律)以保障构建可重现性的机制。

0 人收藏 0 人点赞
#cpp

nasa/fprime

GitHub Trending (daily) ↗ · 2026-07-11 缓存

F´(F Prime)是一个由NASA/JPL开发的开源、组件驱动框架,用于快速开发和部署航天及其他嵌入式软件应用,支持包括CubeSat在内的多种平台。

0 人收藏 0 人点赞
#cpp

ggml-org/llama.cpp

GitHub Trending (daily) ↗ · 2026-05-18 缓存

llama.cpp 是一个开源 C/C++ 库,用于在本地硬件上高效运行 LLM 推理,支持多种量化方法和多后端(CPU、GPU 等)。

0 人收藏 0 人点赞
← Previous
← 返回首页

提交意见反馈