从reddit/hackernews/lobsters/meetingcpp摘抄一些c++动态。
每周更新
欢迎投稿,推荐或自荐文章/软件/资源等,请提交 issue
大概是程序验证的东西,看不懂
Bjarne Stroustrup在PLDI上发表了重要讲话,总结了c++近年来的飞速发展
这有个pdf
需要了解simd sse 汇编
An iterator
IS-NOT-A const_iterator
语言律师Arthur O’Dwyer 又给我们整新活了。
template<class C>
struct Wrap {
Wrap(C&);
operator C::iterator() const;
};
template<class C>
void f(C&, typename C::const_iterator);
int main() {
std::list<int> v;
f(v, Wrap(v));
}
这段代码在不同的libc++下表现不一致,msvc能编过(Godbolt).
之前也有讨论const iterator的实现
https://quuxplusone.github.io/blog/2018/12/01/const-iterator-antipatterns/
Daniel Lemire 新活, 场景是合并两个排好序的数组,伪代码这样
v1 = first value in input 1
v2 = first value in input 2
while(....) {
if(v1 < v2) {
output v1
advance v1
} else if (v1 > v2) {
output v2
advance v2
} else {
output v1 == v2
advance v1 and v2
}
}
如何减少分支?用?:
while ((pos1 < size1) & (pos2 < size2)) {
v1 = input1[pos1];
v2 = input2[pos2];
output_buffer[pos++] = (v1 <= v2) ? v1 : v2;
pos1 = (v1 <= v2) ? pos1 + 1 : pos1;
pos2 = (v1 >= v2) ? pos2 + 1 : pos2;
}
看生成的汇编,效果很好很多move godbolt
他的测试代码在这里https://github.com/lemire/Code-used-on-Daniel-Lemire-s-blog/blob/master/2021/07/14/union2by2.cpp
简单压测的数据
system | conventional union | ‘branchless’ union |
---|---|---|
Apple M1, LLVM 12 | 2.5 | 2.0 |
AMD Zen 2, GCC 10 | 3.4 | 3.7 |
AMD Zen 2, LLVM 11 | 3.4 | 3.0 |
但是我用quickbench的到的数据,gcc场景不快,clang场景快了一点
https://quick-bench.com/q/tNdjEe-55p6zPjDGF-jBIgDYJAQ
来看看第二季度c++提案有什么好看的
Making std::unique_ptr constexprP2273R1
让unique_ptr更灵活,不必要的RAII去掉,比如这种
constexpr auto fun() {
auto p = std::make_unique <int>(4);
return *p;
}
constexpr auto i = fun();
static_assert(4 == i);
Support for UTF-8 as a portable source file encodingP2295R3 统一一下utf编码
Stacktrace from exception P2370R0 抛异常会丢堆栈信息,这也是很多人不愿意用std::thread的原因,旧版本有问题,会丢堆栈,这里加个补丁
std::expected P0323R10 终于有了,这个就是rocksdb那种status类的泛式封装,像这样
std::expected<Object, error_code> PrepareData(inputs...);
**Mark all library static cast wrappers as [[nodiscard]] ** P2351R0 还是补丁,static_cast右值会告警,但是std::move不会,但std::move是static_cast简单包了一层,所以把static_cast也标记上
val;
static_cast<T &&>(val); // gives warning
std::move(val); // no warning!
还有这些也建议加上[[nodiscard]]
to_integer
forward
move
- yep,move()
doesn’t move :) it’s a cast to r-value reference.move_if_noexcept
as_const
to_underlying
identity
bit_cast
注意下面的代码中try catch的用法,godbolt体验
struct foo {
foo() { throw 0; }
};
struct bar {
bar() try : foo_{} {
// constructor body
}
catch (...)
{
// exceptions from the initializer list are caught here
// but also re-thrown after this block (unless the program is aborted)
}
private:
foo foo_;
};
int main() try {
bar b{};
}
catch(...) {
// okay, exception cought here!
}
可能有人不知道cd命令实际上是bash内建(builtin)的命令,这里带你了解bash builtin函数的面纱以及手把手教你写一个builtin函数
完整代码在这里 https://github.com/lollipopman/bash-ini-builtin-blog-post
在嵌入式平台,比如stm32之类的小芯片上跑c++的代码。大概意思是实现了一个库,把c++代码翻译成c
旋转字符串的几种写法
代码简单走读O3DE,一个游戏引擎 https://github.com/o3de/o3de 简单总结-读起来有点费劲
这人想要变参friend,苦于不懂编译器,到cppnow来找人帮忙来了,老哥很幽默