前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ 动态新闻推送 第41期

C++ 动态新闻推送 第41期

作者头像
王很水
发布2021-12-12 14:16:19
3530
发布2021-12-12 14:16:19
举报

C++ 动态新闻推送 第41期

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

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

腾讯云+社区

资讯

cppnow也快开始了

boost 1.78版本发布 asio支持io_uring

文章

没啥说的,代码走读

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

range有bool语义

代码语言:javascript
复制
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并没有这个接口。挺坑的

代码语言:javascript
复制
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之前讲过,可以理解成接口对象, 不同的库为了实现这玩意,弄了一层命名空间,把这玩意隐藏起来,避免影响库本身的同名函数

代码语言:javascript
复制
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

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

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

最简单的想法

代码语言:javascript
复制
struct some_class {
	inline static some_class s_instance{}; // Invalid; some_class is not a complete type
}

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

代码语言:javascript
复制
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,比如

代码语言:javascript
复制
auto operator<=>( const Swallow& ) const = default;

比如string的start_with end_with接口

bit_cast

Std::remove换成std::erase

中位数?

代码语言:javascript
复制
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的站长, 手把手带你看汇编

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

项目

  • binary_log 又一个log库,和nanalog/binlog 那些日志库差不多,都是ns级别
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C++ 动态新闻推送 第41期
    • 资讯
      • 文章
        • 视频
          • 项目
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档