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?
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