公众号
qq群 点击进入
RSS https://github.com/wanghenshui/cppweeklynews/releases.atom
欢迎投稿,推荐或自荐文章/软件/资源等,评论区留言
本期文章由 HNY 寻找我的皮卡丘 岚岚路 赞助
标准委员会动态/ide/编译器信息放在这里
最近比较热闹的就是P1144 和 P2786 吵架了 1144作者也在收集意见 Help wanted: Compile your codebase with P1144 and P2786 relocatability!
开源库都实现了1144,2786点占坑的意思
另外就是 异常,lewis baker弄了新东西
感动
编译器信息最新动态推荐关注hellogcc公众号 本周更新 2024-04-17 第250期
无人关注的角落 cmake支持了import std
lewis baker文章翻译。没看的都看看,17年的文了
写的挺有意思
省流 内存使用太高导致 反复page fault 用户的代码段也在page cache中,导致反复读盘
没看的看一下,自吹自擂一下
介绍经典的求平方根代码
float Q_rsqrt(float number)
{
long i;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
y = number;
i = * ( long * ) &y; // evil floating point bit level hacking
i = 0x5f3759df - ( i >> 1 ); // what the fuck?
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
// y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed
return y;
}
学一下吧,学无止境
目前的最快的最大公约数(GCD)算法是 Binary GCD algorithm
大概思路就是分奇偶讨论,替换掉除法
实现通常是这样
template <typename int_type>
int_type binary_gcd(int_type u, int_type v) {
if (u == 0) { return v; }
if (v == 0) { return u; }
auto shift = std::countr_zero(u | v);
u >>= std::countr_zero(u);
do {
v >>= std::countr_zero(v);
if (u > v) { std::swap(u, v); }
v = v - u;
} while (v != 0);
return u << shift;
}
考虑优化这个代码
首先去掉swap
int_type binary_gcd_noswap(int_type u, int_type v) {
if (u == 0) { return v; }
if (v == 0) { return u; }
auto shift = std::countr_zero(u | v);
u >>= std::countr_zero(u);
do {
int_type t = v >> std::countr_zero(v);
if (u > t) v = u - t, u = t;
else v = t - u;
} while (v != 0);
return u << shift;
}
压测了一下 gcc上没区别,clang上快,主要是gcc上gcd的实现用的是相同算法
template<typename T>
struct slice {
T *data = 0;
size len = 0;
size cap = 0;
slice<T> = default;
template<size N>
slice<T>(T (&a)[N]) : data{a}, len{N}, cap{N} {}
T &operator[](size i) { ... }
}
template<typename T>
slice<T> append(arena *, slice<T>, T);
其实就是iobuf 哥们总爱重新发明东西
简单说就是free偶尔会很重,用rcu之类的手段还是很有必要的
一个fuzz找bug的经验,很精彩,主要是通过fuzzer找到有问题的测试用例,
然后重写接口,增加调用,拿到更多有问题的测试用例,分析用例特点
有点意思,这里标记一个TODO,有空翻译一下
一段幽默的代码
#include <any>
#include <memory>
std::unique_ptr<std::any> get_value();
int main() {
auto p = get_value();
// 干了一点其他的活,之后释放指针
p->reset();
}
发现问题没有 应该是p.reset()
p->reset()
实际上是std::any
的
这也是重载 operator dot有风险的原因之一
只能说抽象,注意别写错
周末下雨本计划搬家,收拾了半天结果下雨硬是没搬,浪费了宝贵的周末,哎呦,每次浪费时间都特别懊悔