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

2021-09-26 11:10:14 浏览数 (1)

C 动态新闻推送 第31期

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

每周更新

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

腾讯云 社区

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


资讯

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

OSDT Weekly 2021-09-22 第116期

标准委员会九月邮件列表直达

文章

  • Binary Banshees and Digital Demons

讨论了各种各样新方案以及相关的abi-break问题,ABI-break这个问题必须要面对了,标准委员会还在拖

感觉未来要做ABI-break支持的准备的了

  • Borrowing Trouble: The Difficulties Of A C Borrow-Checker

直接看结论吧

We attempted to represent ownership and borrowing through the C type system, however the language does not lend itself to this. Thus memory safety in C would need to be achieved through runtime checks.

试验了实现borrow-checker库,但是语言库层面有局限实现不了rust那种功能(可能需要编译器开洞?)

  • c tip of week Did you know about compiler predefined macros assosicated with the compilation date/time?
代码语言:javascript复制
static_assert(std::string_view{"07:36::22"} == std::string_view{__TIME__}); // will only pass at certin time
static_assert(std::string_view{"Sep 19 2021"} == std::string_view{__DATE__}); // will only pass at certin date

没什么卵用的知识

  • C 20 Coroutine Iterators

借助coroutine实现iterator生成器

  • Async stack traces in folly: Introduction
  • Async stack traces in folly: Synchronous and asynchronous stack traces

异步调用的堆栈分析一直是个麻烦的问题 这里介绍folly在这方面做的一些工作,如何实现打印异步的堆栈

使用coroutine来搞。很有意思

coroutine相关的概念在现在来说,需要面对并且掌握了,不然后面的文章可能看不懂

  • std::optional and non-POD C types

std::optional和非POD类型的结合可能有点问题

代码语言:javascript复制
class Object {
 private:
  std::string _s;

 public:
  Object() { puts("default-constructed"); }
  ~Object() { puts("destroyed"); }

  explicit Object(const std::string &s) : _s(s) { puts("constructed"); }

  Object(const Object &m) : _s(m._s) { puts("copy-constructed"); }
  Object &operator=(const Object &m) {
    puts("copy-assinged");
    _s = m._s;
    return *this;
  }

  Object(Object &&m) : _s(std::move(m._s)) { puts("move-constructed"); }
  Object &operator=(Object &&m) {
    puts("move-assigned");
    _s = std::move(m._s);
    return *this;
  }

  void dump() const { puts(_s.c_str()); }
};
std::optional<Object> maybe(const std::string &s) {
  if (s.empty()) {
    return std::nullopt;
  }
  return Object(s);
}

看起来没啥问题

但31行的return会多两次复制

改成

代码语言:javascript复制
Object makeObject(const std::string &s);

std::optional<Object> maybe(const std::string &s) {
  if (s.empty()) {
    return std::nullopt;
  }
  return makeObject(s);
}

但更多场景是这样的的

代码语言:javascript复制
std::optional<Object> maybe(const std::string &s) {
  if (s.empty()) {
    return std::nullopt;
  }
  Object o(s);
  doSomething(o);
  return o;
}

导致拷贝不可避免

一个小弊端,但是optional的收益不是特别高,仅仅一个语法糖

不过不必过于纠结这个问题

  • C Return: std::any, std::optional, or std::variant?

std::expected做铺垫的。都没有std::expected

  • A class without a copy constructor

也许你会说delete拷贝构造函数不就行了,其实delete了也是存在的(present),不过被标记成了delete ,代码意义上的存在,虽然无法使用

那么有没有真正的解决办法呢?

代码语言:javascript复制
template<class T>
struct C {
    C(const C&) requires (sizeof(T) != 1);
}

由于require不满足条件,拷贝构造不会生成,char不满足条件,也就是说C<char>没拷贝构造

这里有个msvc的例子

代码语言:javascript复制
struct FromC { FromC(const C<char>&); };
void f(C<char>);
void f(FromC);
void test(const C<char>& c) {
    f(c);
        // C<char>没有拷贝构造函数,不应该匹配上,应该匹配FromC
}

const C<char>& c转换为C<char>需要拷贝构造但C<char>没有,所以匹配FromC

当前clang和gcc还没有实现类似的场景,匹配了C<char>

视频

  • C Weekly - Ep 290 - C 14’s Digit Separators and Binary Literals

这个视频有三分钟的内嵌广告,有没有懂的说下这个广告值多少钱

实际上就是这段代码

代码语言:javascript复制
auto a = 0xFF'AA;
auto num = 1'000'000'000'000;

注意这个分号的用法,增加代码可读性

实际上现在新的语言都加了这个小语法糖,分隔符,比如rust

数字字面值

例子

Decimal (十进制)

98_222

Hex (十六进制)

0xff

Octal (八进制)

0o77

Binary (二进制)

0b1111_0000

Byte (单字节字符)(仅限于u8)

b'A'

把cpp on sea的视频总结一下

  • CI Your Presentation for Fun and Profit

写了一个reavel.js和compile explorer结合的npm包,这样代码演示片段可以直接跳转到complie explore里面去看,很有意思

使用方法在npm包详情页

  • [Bitmaps! Or “Images and Animations Without Linking External Libraries” - Mariusz Różycki C on Sea](Bitmaps! Or “Images and Animations Without Linking External Libraries” - Mariusz Różycki C on Sea)

把代码打印成图,用imagemagick的convert来转,代码在这里

项目

  • btop一个top实现,类似htop那种ui界面
  • stralgo 一个string算法库,各种转换小工具,header-only

0 人点赞