C++ 中文周刊 第21期

reddit/hackernews/lobsters/meetingcpp摘抄一些c++动态。

每周更新

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

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


资讯

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

本周周报github直达

大概是程序验证的东西,看不懂

Bjarne Stroustrup在PLDI上发表了重要讲话,总结了c++近年来的飞速发展

这有个pdf

文章

需要了解simd sse 汇编

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]]

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来找人帮忙来了,老哥很幽默

项目


本文永久链接

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