C++ 中文周刊 第1期

每周日推送从reddit/hackernews/lobsters/meetingcpp摘抄一些c++动态。

周刊项目地址 github在线地址 知乎专栏

欢迎投稿,推荐或自荐文章/软件/资源等,请提交 issue


资讯

关于c++标准会的最新进展 c++23

herb介绍了几个他感兴趣的小补丁

涉及到语法细节我也不懂,可以看trip report中引用的论文看详细细节

感觉能用在反射上

之前c++ weekly也讨论了std::source_location 链接 很有用处

编译器信息最新动态推荐关注hellogcc公众号

github也有更新,见https://github.com/hellogcc/osdt-weekly

文章

实现并行的copy_if

c++17已经实现了一些并行算法,实现比较粗暴

std::sort(std::execution::par, ...);
std::for_each(std::execution::par, ...);

std::execution::parallel_policy不要求顺序,这样可能有线性的性能提升,但是对于sort,可能需要同步

对于copy_if来说,返回新的对象,这个返回结果,多线程写入,必然需要同步。作者给出了几种实现方案

1 简单加锁 2 利用算法规避锁,3 分块 其中某些场景下多线程并没有起到加速的作用。

第二种方法 用到了std::exclusive_scan 可以了解下,类似haskell map+scanl

clang的一个编译告警-Wsuggest-override

这里讲了一个场景

struct B {
    virtual int f() = 0;
    virtual int g() = 0;
};

struct C : B {
    int f() override;

    virtual int g() final;  // overrides
    virtual int h() final;  // doesn't
};

一个函数同时被virtual和final修饰,可能看不清本身的含义,通过这个编译能让不清楚的接口语义提前暴露出来

并推荐基类 virtual,继承用override/final 尽可能别混用,当然也存在这个基类是另外一个基类的子类的场景,导致同时有virtual和final,尽量避免

一个协程的教程

concept

简单来说,就是这段代码

template <typename T>
concept Number = std::integral<T> || std::floating_point<T>;

template <typename T>
requires Number<T>
class WrappedNumber {
public:
  WrappedNumber(T num) : m_num(num) {}
private:
  T  m_num;
};

template <typename T>
requires Number<T>
auto add(T a, T b) {
  return a+b;
}

注意这里concept和requirs的用法

Guru of the Week #100 Preconditions, Part 1

这里在介绍断言的两种语义,在前面校验还是在后面校验,类似gsl::Expect gsl::Ensure的区别,写的非常长

hurb是constract 提案的作者,所以对这些概念解释的比较细致。文章我没有仔细看。

同步的outputstream

std::cout多线程写是会乱序的,c++20引入了std::osyncstream,这样所有的都会同步

ps: stream这套东西应该没人用吧

cpp tips of week #214 Did you know about variadic aggregate initialization?

介绍variadic aggregate initialization的 数组初始化可以变参模版初始化,这个例子太魔鬼了,可以看这个博客 理解一下

视频

cpp weekly

老生常谈,讲的 C++’s Most Vexing Parse

Meeting C++ YT - Jonathan Müller - The Static Initialization Order Fiasco

借着实现一个logger库的例子,讨论各种初始化的顺序。

Timur Doumler - How C++20 changes the way we write code - Meeting C++ 2020

介绍c++20的四个概念coroutine/concept/module/range,以及如何改善c++代码

cppcast 每周更新

开源项目

一个用c++实现的lisp wiki丰富

mold 一个现代的linker 解决的问题是当前编译环境的瓶颈容易在链接上,没有充分利用并行化优势

mold的目标是要比cat还快,首先并发做文件拷贝,比单线程cat快,其次文件拷贝瓶颈在IO,可以用空闲的cpu做其他事情

llvm 的lld其实在这方面已经做了优化,但作者认为还是慢

还有很多设计可以在readme中看到

讨论

工具

toolchain 介绍周边工具

hacking cpp 有很多c++的资料,比如https://hackingcpp.com/cpp/std/containers.html


本文永久链接

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