每周日推送从reddit/hackernews/lobsters/meetingcpp摘抄一些c++动态。
周刊项目地址 github,在线地址 | 知乎专栏 |
欢迎投稿,推荐或自荐文章/软件/资源等,请提交 issue
关于c++标准会的最新进展 c++23
herb介绍了几个他感兴趣的小补丁
加强std::visit处理继承std::variant 的场景
std::underlying_type_t<T>
涉及到语法细节我也不懂,可以看trip report中引用的论文看详细细节
感觉能用在反射上
之前c++ weekly也讨论了std::source_location 链接 很有用处
github也有更新,见https://github.com/hellogcc/osdt-weekly
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,尽量避免
简单来说,就是这段代码
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的区别,写的非常长
- A precondition is a predicate that should hold upon entry into a function. It expresses a function’s expectation on its arguments and/or the state of objects that may be used by the function.
- A postcondition is a predicate that should hold upon exit from a function. It expresses the conditions that a function should ensure for the return value and/or the state of objects that may be used by the function.
hurb是constract 提案的作者,所以对这些概念解释的比较细致。文章我没有仔细看。
std::cout多线程写是会乱序的,c++20引入了std::osyncstream,这样所有的都会同步
ps: stream这套东西应该没人用吧
cpp tips of week #214 Did you know about variadic aggregate initialization?
介绍variadic aggregate initialization的 数组初始化可以变参模版初始化,这个例子太魔鬼了,可以看这个博客 理解一下
老生常谈,讲的 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++代码
一个用c++实现的lisp wiki丰富
mold 一个现代的linker 解决的问题是当前编译环境的瓶颈容易在链接上,没有充分利用并行化优势
mold的目标是要比cat还快,首先并发做文件拷贝,比单线程cat快,其次文件拷贝瓶颈在IO,可以用空闲的cpu做其他事情
llvm 的lld其实在这方面已经做了优化,但作者认为还是慢
还有很多设计可以在readme中看到
toolchain 介绍周边工具
hacking cpp 有很多c++的资料,比如https://hackingcpp.com/cpp/std/containers.html