公众号
点击「查看原文」跳转到 GitHub 上对应文件,链接就可以点击了
qq群 753792291 答疑在这里
欢迎投稿,推荐或自荐文章/软件/资源等,评论区留言
标准委员会动态/ide/编译器信息放在这里
编译器信息最新动态推荐关注hellogcc公众号 本周更新 2025-01-08 第288期
不过感觉实现有点简单,不如这个 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审稿
为了贴近标准库语法,使用operator | 尽管编译报错各种难看 |
另外就是引入iterable概念 想努力进29
另外这个Flux还是做了一些涉及规避view::filter的缺点的
裸循环不比range慢(直觉结论)
一段抽象代码
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更干净更省,type traits描述能力太弱,一层叠一层
godbolt短链走google跳转,不幸的是google短链跳转要关了,作者正在抢救
查找类型 | 触发形式 | 搜索范围 | 适用场景 |
---|---|---|---|
限定名称查找 Qualified | a::b::x |
仅 :: 左侧指定作用域 |
精确控制符号来源 |
非限定名称查找 Unqualified | x |
由内向外逐层作用域 | 局部变量、类成员、全局量 |
参数依赖查找 (ADL) | func(arg) |
常规作用域 + 参数类型命名空间 | 函数调用(尤其运算符) |
不是 optional,是帮助move的堆上T,虽然用起来有点像,
if (!i.valueless_after_move())
std::cout << *i;
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倍 | 指令依赖链 |
简单来说,就是move的用法以及收益
典型两个场景
局部变量返回
// 错误!阻止 NRVO 优化,强制降级为移动
return std::move(local_obj);
// 正确:允许编译器优化(直接构造或自动移动)
return local_obj;
类成员用完就丢
class Widget {
std::vector<int> data_;
public:
auto getData() {
return std::move(data_); // 必须!避免拷贝
}
};
if not mylist
比 if len(mylist) == 0
快,两者的指令不一样,一个是LOAD_GLOBAL, TO_BOOL,一个是 LOAD_GLOBAL, LOAD_FAST, CALL, LOAD_CONST, COMPARE_OP