前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ 中文周刊 第88期

C++ 中文周刊 第88期

作者头像
王很水
发布2022-11-24 21:18:46
4940
发布2022-11-24 21:18:46
举报

资讯

标准委员会动态/ide/编译器信息放在这里

编译器信息最新动态推荐关注hellogcc公众号 本周更新 2022-01-05 第131期

boost 1.81 beta发布 https://boostorg.jfrog.io/artifactory/main/beta/1.81.0.beta1/source

有Boost.URL,也有boost.unordered_flat_map,尝鲜可以试试

文章

手把手写反射,可以这里 https://godbolt.org/z/qsqe3aW6b 体验一下,还是很有意思的

各种bit strings比较(vector<bool>, bitset<N>,boostd::dynamic_bitset) 谁find更快,结论libc++(llvm)有优化,libstdcxx(gcc)没有

有意思

简单说,就是未定义行为都是代码屎山,所以可以根据屎的最初形态来找一些蛛丝马迹。。。

c语言过于底层,已经成为 协议/接口的一部分了 。后来的语言都要缝缝补补c

perf分析 。qt相关。不太懂

std::unreachable();一看就懂

std::to_underlying 是这玩意

代码语言:javascript
复制
template <typename Enum>
constexpr auto to_underlying(Enum e) noexcept
{
    return static_cast<std::underlying_type_t<Enum>>(e);
}

std::byteswap 看这个例子

代码语言:javascript
复制
template <std::integral T>
void print_hex(T v)
{
   for (std::size_t i = 0; i < sizeof(T); ++i, v >>= 8)
   {
      std::cout << std::format("{:02X} ", static_cast<unsigned>(T(0xFF) & v));
   }
   std::cout << '\n';
}
int main()
{
   unsigned char a = 0xBA;
   print_hex(a);                    // BA
   print_hex(std::byteswap(a));     // BA
   unsigned short b = 0xBAAD;
   print_hex(b);                    // AD BA
   print_hex(std::byteswap(b));     // BA AD
   int c = 0xBAADF00D;
   print_hex(c);                    // 0D F0 AD BA
   print_hex(std::byteswap(c));     // BA AD F0 0D
   long long d = 0xBAADF00DBAADC0FE;
   print_hex(d);                    // FE C0 AD BA 0D F0 AD BA
   print_hex(std::byteswap(d));     // BA AD F0 0D BA AD C0 FE
}

看不懂

简单来说,就是使用继承T,把T本身多余的信息吃掉。花哨。看个乐

代码语言:javascript
复制
template<auto...> struct long_type {};

//生成类型long_type<0,1,2,3...41>
using long_type_t = decltype(
    []<auto... Ns>(std::index_sequence<Ns...>) {
        return long_type<Ns...>{};
    }
    (std::make_index_sequence<42>{})
);

// typename erasure
// 通过继承直接吃掉long_type_t的类型
struct short_type_t : long_type_t{};

// generic typename erasure
// 泛型版本的继承,吃掉类型。这个T得有默认构造,不然编译不过
template<class T> using typename_erasure = decltype([] {
    struct s : T { using T::T; }; // generated in the compiler as `$0::s` or similar
    return s{};
}());

int main() {
    assert(std::string_view{typeid(long_type_t).name()}.size() > 100); // 长类型
    assert(std::string_view{typeid(short_type_t).name()}.size() < 15); // 短类型
    assert(std::string_view{typeid(typename_erasure<long_type_t>).name()}.size() < 25); // 短类型
}

茴香豆的茴有几种写法?

这个和c++没啥关系,但是非常有意思

视频

没啥说的

开源项目需要人手

  • asteria 一个脚本语言,可嵌入,长期找人,希望胖友们帮帮忙,也可以加群384042845和作者对线
  • pika 一个nosql 存储, redis over rocksdb,非常需要人贡献代码胖友们, 感兴趣的欢迎加群294254078前来对线

新项目介绍/版本更新

  • gdbpmp用gdb来profile的脚本,感觉和perf差不多
  • ctp 编译期打印
  • Ichor c++20依赖注入框架。测试mock使用。有点复杂
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章
  • 视频
  • 开源项目需要人手
  • 新项目介绍/版本更新
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档