C++ 中文周刊 2025-06-02 第185期

周刊项目地址

公众号

点击「查看原文」跳转到 GitHub 上对应文件,链接就可以点击了

qq群 753792291 答疑在这里

RSS

欢迎投稿,推荐或自荐文章/软件/资源等,评论区留言


资讯

标准委员会动态/ide/编译器信息放在这里

编译器信息最新动态推荐关注hellogcc公众号 本周更新 2025-01-08 第288期

性能周刊

boost 新增bloom

不过感觉实现有点简单,不如这个 https://github.com/YimingQiao/Fastest-Bloom-Filter

boost新增接口库 Boost.OpenMethod

看下代码

https://github.com/jll63/Boost.OpenMethod/blob/master/examples/slides.cpp

感觉有点复杂

上一期评论

Declaring a friendship to self 什么时候需要friend 自身

Q ni 提问 作者懂不懂什么叫声明自身为友元, 根本没有这种东西 Q Da’Inihlust 和t就是不同类型 别人写的不对,你转发不解释,事实就是转发不负责

A: 接受批评,以后会AI审稿

文章

The Road to Flux 1.0

为了贴近标准库语法,使用operator 尽管编译报错各种难看

另外就是引入iterable概念 想努力进29

另外这个Flux还是做了一些涉及规避view::filter的缺点的

Raw loops for performance

裸循环不比range慢(直觉结论)

The case of creating new instances when you wanted to use the same one

一段抽象代码

Widget GetWidget() {
    if (!m_widget) {
        m_widget = std::make_unique<Widget>();
    }
    return m_widget.get(); // 这里有问题
}

由于Widget有接受bool的构造函数,又没有标记explicit,这里返回指针被转成true了

等价于

return Widget(m_widget.get() != nullptr); 

要么改返回值,要么构造函数加explicit抓到这个问题

Concepts vs type traits

简单来说就是concepts更干净更省,type traits描述能力太弱,一层叠一层

Compiler Explorer and the Promise of URLs That Last Forever

godbolt短链走google跳转,不幸的是google短链跳转要关了,作者正在抢救

Three types of name lookups in C++

查找类型 触发形式 搜索范围 适用场景
限定名称查找 Qualified a::b::x :: 左侧指定作用域 精确控制符号来源
非限定名称查找 Unqualified x 由内向外逐层作用域 局部变量、类成员、全局量
参数依赖查找 (ADL) func(arg) 常规作用域 + ​参数类型命名空间 函数调用(尤其运算符)

What Is the Value of std::indirect T

不是 optional,是帮助move的堆上T,虽然用起来有点像,

if (!i.valueless_after_move()) 
    std::cout << *i;

An optimizing compiler doesn’t help much with long instruction dependencies

hash表查询类似

for (size_t i { 0ULL }; i < pointers.size(); i++) {
    sum += vector[pointers[i]];
}

链表遍历类似

while(p < total_accesses) {
    sum += list[idx].value;
    idx = list[idx].next;
    
    if (idx == node_t::NULLPTR) {
        idx = 0U;
    }

    p++;
}

​高ILP场景​:编译器优化仍有价值(如3倍加速),但需结合内存访问优化。

​低ILP场景​:需重构算法(如改链表为数组)打破依赖链,而非依赖编译

场景 O3比O1指令减少比例 O3比O1最大加速比 主要瓶颈
随机内存访问(高ILP) 10:1 3倍 内存带宽
链表遍历(低ILP) 4.6:1 ≤2.12倍 指令依赖链

std move Is Not Free

简单来说,就是move的用法以及收益

典型两个场景

局部变量返回

// 错误!阻止 NRVO 优化,强制降级为移动
return std::move(local_obj); 

// 正确:允许编译器优化(直接构造或自动移动)
return local_obj;          

类成员用完就丢

class Widget {
    std::vector<int> data_;
public:
    auto getData() { 
        return std::move(data_); // 必须!避免拷贝
    }
};

Python Performance: Why ‘if not list’ is 2x Faster Than Using len()

if not mylistif len(mylist) == 0 快,两者的指令不一样,一个是LOAD_GLOBAL, TO_BOOL,一个是 LOAD_GLOBAL, LOAD_FAST, CALL, LOAD_CONST, COMPARE_OP

开源项目介绍


上一期

本期

下一期

看到这里或许你有建议或者疑问或者指出错误,请留言评论! 多谢! 你的评论非常重要!也可以帮忙点赞收藏转发!多谢支持! 觉得写的不错那就给点吧, 在线乞讨 微信转账