C++ 中文周刊 第41期

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

周刊项目地址在线地址知乎专栏 腾讯云+社区

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


资讯

cppnow也快开始了

编译器信息最新动态推荐关注hellogcc公众号 本周更新 OSDT Weekly 2021-12-08 第128期

boost 1.78版本发布 asio支持io_uring

文章

没啥说的,代码走读

手把手教你写参数解析(直接用getopt/cli11得了)

range有bool语义

namespace rv = std::views;

std::vector<int> v = {1,2,3,4,5};
auto isOdd = [](int x) { return (x % 2) != 0; };
if (v | rv::filter(isOdd)) {
    puts("v contains at least one odd number");
}

前提是有view_interface接口,有些view并没有这个接口。挺坑的

if (auto r = "foo"sv | rv::reverse)               // OK, r is reverse_view<string_view>
if (auto r = "foo"sv | rv::reverse | rv::reverse) // Error, r is string_view

if (auto r = v | rv::drop(1))             // OK, r is drop_view<ref_view<vector<int>>>
if (auto r = std::span(v) | rv::drop(1))  // Error, r is span<int>

一个测试,pledge是openbsd的一个权限API限制接口,LD_PRELOAD 能hook系统调用pledge, 导致pledge失效,从而绕过

vector push_back导致迭代器失效,很让人烦恼。作者想到了一个绕过的办法,你猜猜是不是mmap 代码实现

主要是避免搬迁,在mmap基础上进行扩展/缩小空间,作者的性能测试表示,在大量内存的场景下,比vector要好,小对象不如

CPO之前讲过,可以理解成接口对象, 不同的库为了实现这玩意,弄了一层命名空间,把这玩意隐藏起来,避免影响库本身的同名函数

namespace std::ranges {
  namespace __iter_swap {
    struct __fn {
      auto operator()(~~~) const { ~~~ }
    };
  }
  inline namespace __cpo {
    inline constexpr auto iter_swap = __iter_swap::__fn{};
  }
}

namespace std::ranges {
  template<~~~>
  struct counted_iterator {
    friend void iter_swap(counted_iterator, counted_iterator) { ~~~ }
  };
}

这个是libc++的代码,gcc用的__cust msvc用的_Cpos大同小异

作者实现了一版csvquote ,简单一测比原版快20倍,用上了SIMD

感兴趣的可以看看实现。我没有研究

创造一个没有名字的全局单例,怎么做?

最简单的想法

struct some_class {
	inline static some_class s_instance{}; // Invalid; some_class is not a complete type
}

肯定不行,作者给了个非常骚的操作,static_assert

namespace static_initializer {

template<typename T>
struct instance_container {
	static constexpr T* instance() {
		return &s_instance;
	}

	inline static T s_instance{};
};

} // namespace static_initializer

// ... Some .cpp file
struct some_class {
	some_class() {
		std::cout << "test text" << std::endl;
	}
};

static_assert(static_initializer::instance_container<some_class>::instance() != nullptr);
// Neither some_class nor instance_container<some_class> are referenced anywhere else

这个东西的用处可能是防止反编译,且绝对意义上的全剧唯一单例,缺点,你这么写没人愿意改,可能很难合入

sonarsource他们是做静态检查分析的

快速把代码改成c++20的

使用各种c++20 api,比如

auto operator<=>( const Swallow& ) const = default;

比如string的start_with end_with接口

bit_cast

Std::remove换成std::erase

中位数?

auto m = a + (b - a) / 2; //换成std::midpoint
auto i = a + (b - a) * 0.3f; //换成std::lerp

使用facebook的BOLT来做的二进制优化比clang自身的LTO优化,要快。这个后面会合入llvm

但是没有和gcc LTO的比较

给自己的游戏加一个控制台 控制台代码在这里

sqrt有点慢,加上-fno-math-errno就快了,这个flag之前咱们也讲过。这个优化会导致malloc 的errno也不处理。这个bug好像还没修

Advent of Code解题记录,这个活动仍在进行,感兴趣的可以玩玩

介绍了is_base_of的用法

视频

cppcon2021视频列表 之前讲过的就不说了,一共90多个,真是看不完

协程在网络编程使用上非常省事

这个讲的module的细节,比如要满足One Define Rule之类的。

又一个实现erlang actor模型的库 代码在这里

讲emscripten的。不懂相关概念,就没看

讲一些最佳实践,老大讲的我昏昏欲睡

这个有点back to basic的感觉了,讲异常以及各种平台的表现

讲代码设计的,api设计的尽可能强类型之类的,老生常谈了

没啥看的

这哥们T恤还行,想整一件。讲的没啥意思

constexpr的点子,比如constexpr compression constexpr alloctor

这个讲的是错误码,使用std::error_code来维护整体状态,不用goto/errno/全局状态,以及怎么用std::error_code这套设施写代码

讲配置可维护性

讲编译系统库依赖相关的问题

讲他们公司c++技术演进,如何让代码更安全(多用override/auto/constexpr之类的)

黑科技,constexpr来做编译期压缩/编译期crc32 编译期计算 虽然这个演讲者讲的让人困,但是这个创意是真有意思 PPT在这里

讲concept的没啥说的

这个演讲者是cppquiz的站长, 手把手带你看汇编

好了朋友们,虽然还有很多没看完,下期再更

项目

工作招聘

这俩招聘暂时放一个月。主要是没新的

昆仑数据库,魔改mysql的,还支持远程工作,友情推荐一波

现在mysql的代码已经很现代c++了

开发深度学习编译器,而且他们也支持远程工作,c++的,友情推荐一波


本文永久链接

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