本期文章由 HNY 赞助, 本期内容很少
资讯
标准委员会动态/ide/编译器信息放在这里
五月邮件 https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/#mailing2024-05
基本就是range constract executor 相关提案乱炖
讲几个R0
- • executor还没定,基于他的async object就来了。大概意思就是move only function封装用executor来管理/分配内存/生命周期管理,作者还给了POC https://godbolt.org/z/rrbW6veYd 没有细看
- • Type-aware allocation and deallocation functions https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2719r0.html
简单来说就是针对类级别的更精细的内存控制
代码语言:javascript复制operator new(sizeof(T), type_identity<T>{}, args…)
通常这种都是自己搞个数组placement new
提供根据类型的new接口,能更简单实现这种逻辑。看一乐,提供一种思路
- • P3125R0: Pointer Tagging https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3125r0.pdf
这个其实就是很多指针实际上更多是抽象的,可以利用bit做事,但标准对这块不是很清晰,算是UB吧
比如llvm的PointerIntPair arm的MTE hash trie的指针管理 或者pointer swizzle技巧那种把指针搞出复合语义
这种玩意其实就是tag pointer,不同tag表达不同含义,感觉标准化会更好一些
- • Floating-Point Maximum/Minimum Function Objects https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3307r0.html
浮点数的min/max处理了太多边角场景(NaN之类的),不够快,不想用ffastmath情况下提供了一套新接口
- • elide https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3288r0.html
帮你把optional variant any里的T掏出来。这个很干净
实现godbolt https://godbolt.org/z/65fEd3axf
- • A Relocating Swap https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3239r0.pdf
帮P2786加了个接口实现P1144相同能力。看不懂?没事我也不懂
编译器信息最新动态推荐关注hellogcc公众号 本周更新 2024-0522第255期
文章
超好用的 C 在线编译器(VSCode 版)https://zhuanlan.zhihu.com/p/694365783
godbolt集成vscode了,挺好的
C 神秘学习——memcpy的一个ub https://zhuanlan.zhihu.com/p/699259091
memcpy data()了,编译器假设不空优化导致asan报错
vector string当buffer没问题,都用他们当buffer不用他们的成员函数复制是怎么个意思,瞧不起assign?
这个也和群友激烈讨论了
笔者的个人观点,data()虽然不是const,但是最好最好不乱玩,能用成员用成员,实在不行才hack,比如resize这种
assign肯定也是memcpy,他会帮你判断的,你直接拿来用,那肯定说明不为空,那编译器的假设笔者认为没毛病
write()和mmap写混用与cache alias https://zhuanlan.zhihu.com/p/699052979
学到了
SLUB 分配器的下一步计划 https://zhuanlan.zhihu.com/p/699058331
看一乐
C 无锁(lock free)数据结构与有锁数据结构相比,速度,性能等有何区别?多线程中如何选择?https://www.zhihu.com/question/558986994/answer/3498768792
看一乐
long double to_string会丢失精度? https://www.reddit.com/r/cpp/comments/1czb8ul/stdto_stringlong_double_is_broken_and_rounds_the/
代码语言:javascript复制#include <string>
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
long double d = -20704.000055577169;
string s = to_string(d);
cout << s << endl;//-20704.000056
cout << setprecision(12) << fixed << s << endl;
}
两个输出没有差别。注意这个坑 godbolt https://godbolt.org/z/9EWYexK6E
Looking up a C Hash Table with a pre-known hash https://ebadblog.com/looking-up-a-c -hash-table-with-a-pre-known-hash
如果你知道了hash,如何避免容器计算hash?定制Equal,把hash比较也放进去,直接看完整代码
代码语言:javascript复制template<typename Hash>
class KeyHashPair {
private:
std::string_view key_;
std::size_t hash_;
public:
KeyHashPair() = delete;
KeyHashPair(std::string_view sv) : key_(sv), hash_(Hash{}(key_)) {}
std::string_view key() const { return key_; }
std::size_t hash() const { return hash_; }
};
struct Hash {
using is_transparent = void;
std::size_t operator()(std::string_view sv) const {
return std::hash<std::string_view>{}(sv);
}
std::size_t operator()(KeyHashPair<Hash> pair) const {
return pair.hash();
}
};
struct KeyEqual {
using is_transparent = void;
bool operator()(std::string_view lhs, std::string_view rhs) const {
return lhs == rhs;
}
template<typename Hash>
bool operator()(KeyHashPair<Hash> lhs, std::string_view rhs) const {
return lhs.key() == rhs;
}
};
using Set = std::unordered_set<std::string, Hash, KeyEqual>;
int main() {
Set set{"foo"};
const std::string string{"foo"};
const KeyHashPair<Set::hasher> pair{string};
assert(set.contains(pair));
}
还是有点思路提升的,但并没有把hash存下来,其实更合理的思路是直接比较set内部的hash,可惜没有暴露
开源项目介绍
- • https://github.com/lhmouse/asteria 一个脚本语言
- • https://github.com/odygrd/quill/releases/tag/v4.0.0 4.0发布 编译时间 写入速度双提升
- • https://github.com/kboutora/ipvar 多进程共享变量,没明白什么场景用得上