layout | title |
---|---|
post |
第41期 |
从reddit/hackernews/lobsters/meetingcpp摘抄一些c++动态
欢迎投稿,推荐或自荐文章/软件/资源等,请提交 issue
编译器信息最新动态推荐关注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设计的尽可能强类型之类的,老生常谈了
- [“Constexpr Everything” - The Standard Library, Microkernel, Apps, and Unit Tests - Rian Quinn](“Constexpr Everything” - The Standard Library, Microkernel, Apps, and Unit Tests - Rian Quinn)
没啥看的
这哥们T恤还行,想整一件。讲的没啥意思
constexpr的点子,比如constexpr compression constexpr alloctor
这个讲的是错误码,使用std::error_code来维护整体状态,不用goto/errno/全局状态,以及怎么用std::error_code这套设施写代码
讲配置可维护性
讲编译系统库依赖相关的问题
讲他们公司c++技术演进,如何让代码更安全(多用override/auto/constexpr之类的)
黑科技,constexpr来做编译期压缩/编译期crc32 编译期计算 虽然这个演讲者讲的让人困,但是这个创意是真有意思 PPT在这里
讲concept的没啥说的
这个演讲者是cppquiz的站长, 手把手带你看汇编
好了朋友们,虽然还有很多没看完,下期再更
- binary_log 又一个log库,和nanalog/binlog 那些日志库差不多,都是ns级别
这俩招聘暂时放一个月。主要是没新的
昆仑数据库,魔改mysql的,还支持远程工作,友情推荐一波
现在mysql的代码已经很现代c++了
开发深度学习编译器,而且他们也支持远程工作,c++的,友情推荐一波