C++ 中文周刊 2024-01-26 第147期

2024-07-30 14:55:21 浏览数 (1)

RSS https://github.com/wanghenshui/cppweeklynews/releases.atom

欢迎投稿,推荐或自荐文章/软件/资源/批评互动等等

请后台留言

本期文章由 不语 沧海 彩虹蛇皮虾 赞助

jetbrain发布了23年 c 生态回顾 https://blog.jetbrains.com/clion/2024/01/the-cpp-ecosystem-in-2023/

感兴趣的可以看看,没啥意思

资讯

标准委员会动态/ide/编译器信息放在这里

一月邮件

https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/#mailing2024-01

The Second Edition is Done

隔壁公众号汇总了本英文书,感兴趣的可以过去看看,这里友情推荐了

文章

全新的构造函数,C 中的 relocate 构造函数 https://zhuanlan.zhihu.com/p/679782886

其实这个概念之前讨论了很久,老熟人Arthur O’Dwyer 提了很多相关的提案 patch。大家感兴趣的可以读一下。算是一个优化的点

之前也提到过,比如

  • • Polymorphic types aren’t trivially relocatable https://quuxplusone.github.io/blog/2023/06/24/polymorphic-types-arent-trivially-relocatable/
  • • STL algorithms for trivial relocation https://quuxplusone.github.io/blog/2023/03/03/relocate-algorithm-design/

讲trivial relocation的现状以及开源实现

T.r. types

Non-t.r. types

Throwing-move types

Rightward motion (`insert`)

Leftward motion (`erase`)

Non-pointer iterators

STL Classic (non-relocating)

std::copy

N/A

N/A

UB

std::copy_n

N/A

N/A

UB

UB

std::copy_backward

N/A

N/A

UB

cstring

memcpy

UB

UB

UB

SFINAE

memmove

UB

SFINAE

Qt

q_uninitialized_relocate_n

✓?

UB

UB

SFINAE

q_relocate_overlap_n

SFINAE

BSL

destructiveMove

UB

UB

SFINAE

P2786R0

trivially_relocate

SFINAE

SFINAE

SFINAE

relocate

SFINAE

SFINAE

move_and_destroy

SFINAE

UB

?

P1144R6

uninitialized_relocate

UB

uninitialized_relocate_n

UB

P1144R7

uninitialized_relocate_backward

UB

还给人folly提MR https://github.com/facebook/folly/pull/1934

  • std::relocate’s implementation is cute https://quuxplusone.github.io/blog/2022/05/18/std-relocate/

等等,周边信息很多

why gcc and clang sometimes emit an extra mov instruction for std::clamp on x86 https://1f6042.blogspot.com/2024/01/stdclamp-still-generates-less-efficient.html

直接贴代码 https://godbolt.org/z/rq9dsGxh5

对应的汇编

为什么正确的代码多了一条 mov xmm?

浮点数 -0的问题,标准要求返回第一个参数,比如 std::clamp(-0.0f, 0.0f, 0.0f)

如果配置了-ffinite-math-only -fno-signed-zeros 最终汇编是一样的 https://godbolt.org/z/esMY18a5z

Fuzzing an API with libfuzzer https://playfulprogramming.blogspot.com/2024/01/fuzzing-api-with-libfuzzer.html

举一个fuzz例子,大家都学一下

你看这个接口感觉可能无从下手

我们要测试的接口长这样

考虑一下测试代码

可能长这样

现在咱们考虑怎么把这个测试代码改写成fuzz test?

简单来说输入的就是一段二进制,怎么根据这个二进制拆解出不同的动作,拆解出不同的输入?

编译带上-fsanitize=address,undefined,fuzzer --coverage

能抓到错误,抓到错误调试就是另一个流程了,gdb挂上去调就行了。眼神好也能看出来

C 实现 shared_ptr / weak_ptr /enable_shared_from_this https://zhuanlan.zhihu.com/p/680068428

学吧,学无止境

主要是控制块的管理

C Lifetime Profile Static Analyzer https://zhuanlan.zhihu.com/p/678944217

这个哥们把一个工具优化到能用的水平,并介绍了相关设计

这个精力投入令人佩服,代码在这里 https://github.com/qqiangwu/cppsafe

感兴趣的可以体验一下

Linux kernel中有哪些奇技淫巧 https://www.zhihu.com/question/471637144/answer/3377224126

介绍static key的

130期咱们提到过 Bounded dynamicism with cross-modifying code https://pvk.ca/Blog/2021/12/19/bounded-dynamicism-with-cross-modifying-code/

也是类似的玩意,也有现成的库提供,https://github.com/backtrace-labs/dynamic_flag

分享一个asio下使用channel来实现无需队列的安全的连续async_write的方法 https://zhuanlan.zhihu.com/p/679175397

不明觉厉

Detecting multiple instantiations https://www.think-cell.com/en/career/devblog/detecting-multiple-instantiations

利用statufull template来检查,算了吧,不看了

GDB反向调试:让程序逆序执行,代码调试原来这么简单!体验时光旅行的快感!https://zhuanlan.zhihu.com/p/673279895

其实就是record录制

视频

C Weekly - Ep 412 - Possible Uses of C 23's [[assume]] Attribute https://www.youtube.com/watch?v=Frl8XKhvA4Q&ab_channel=C++WeeklyWithJasonTurner

可能的一种用法

感觉不如builtin_expect,暂时别用

Data Storage in Entity Component Systems - Mathieu Ropert - Meeting C 2023 https://www.youtube.com/watch?v=b9hNKFj5R3Y&ab_channel=MeetingCpp

讲ecs框架和entt的

讲entt的视频,最近我看到一个不错的 b站 BV1X841127Rq

Regular, revisited - Victor Ciura - Meeting C 2023 https://www.youtube.com/watch?v=9ilirLg9TzM&ab_channel=MeetingCpp

讲value的。听困了

开源项目介绍

  • • asteria https://github.com/lhmouse/asteria 一个脚本语言,可嵌入,长期找人,希望胖友们帮帮忙,也可以加群753302367和作者对线
  • • Unilang https://github.com/linuxdeepin/unilang deepin的一个通用编程语言,点子有点意思,也缺人,感兴趣的可以github讨论区或者deepin论坛看一看。这里也挂着长期推荐了
  • • https://github.com/kamchatka-volcano/figcone 一个反射库,处理配置文件的
  • • https://github.com/HenryAWE/PapilioCharontis 之前群里说过的带逻辑控制的format,现在基本功能搞定了,欢迎试用体验

热门库最近更新了什么

  • • boost 新的scope库被合入 https://lists.boost.org/Archives/boost/2024/01/255717.php
  • • seastar 最近改动较少

主要是代码规范化 比如 https://github.com/scylladb/seastar/pull/2054

另外就是修复bug,延长请求,请求没结束不释放handler https://github.com/scylladb/seastar/pull/2044/

  • • folly

folly类似seastar 把版本切17之后做了很多的适配和bugfix

比较好玩的是folly::tape 类似vector<vector> 但性能更好,常见场景就是 vector<vector<char>>

https://github.com/facebook/folly/pull/2109/

在使用场景上做了取舍

实现思路就是拍扁,一维,比如tape<vector<char>> 就是vector<char>, 记录所有元素的index和offset

没有SSO优化的话,这种形态比vector<vector<char>>局部性要好

感兴趣大家可以以及看一看

  • • brpc

改动非常多,一月改动如下

  • • 支持内存内置服务,web可查 tcmalloc https://github.com/apache/brpc/pull/2505)
  • • fuzz测试,上面讲过的fuzz不会写,可以学学这个 https://github.com/apache/brpc/pull/2420
  • • gdb脚本修复libc 符号问题,以及lldb脚本 https://github.com/apache/brpc/pull/2516/ https://github.com/apache/brpc/pull/2514
  • • 一个mpsc队列实现 https://github.com/apache/brpc/pull/2492
  • • 支持 c 20 coroutine 不过暂时没人用 https://github.com/apache/brpc/pull/2121
  • • 使用tcmalloc的 GetStackTrace 比backtrace 省点计算 https://github.com/apache/brpc/pull/2488
  • • 修 LoadBalancerWithNaming 内存泄漏 https://github.com/apache/brpc/pull/2503
  • • 给bthread 加tag分组调度 https://github.com/apache/brpc/pull/2476

还是有很多可以学习的地方都

另外rocksdb我也会更新,这个更新的内容不会放在这里,会单独发

也会放在 https://wanghenshui.github.io/rocksdb-doc-cn 里

0 人点赞