C++ 中文周刊 第40期

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

周刊项目地址在线地址知乎专栏 腾讯云+社区

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

最近有点忙cppcon视频没看完


资讯

编译器信息最新动态推荐关注hellogcc公众号 本周更新 OSDT Weekly 2021-12-01 第126期

Qt Creator 6 released

文章

手把手教你写sender/receiver

核心想法就是这个

这个看个乐,代码

$ cat a.c
#include <arpa/inet.h>
#include <sys/socket.h>

#include <netinet/in.h>

#include <err.h>
#include <stdlib.h>

#define PORT 12345

int
main() {
	int sock;
  // 加这行就不报错了	socklen_t length, s_size;
	struct sockaddr_storage server;
	struct sockaddr_in6 *sin = (struct sockaddr_in6 *)&server;
  // 加这行也不报错 memset(sin, 0, sizeof(*sin));
	if ((sock = socket(PF_INET6, SOCK_STREAM, 0)) < 0) {
		err(EXIT_FAILURE, "socket");
		/* NOTREACHED */
	}

	if (inet_pton(PF_INET6, "::1", &(sin->sin6_addr)) != 1) {
		err(EXIT_FAILURE, "inet_pton");
		/* NOTREACHED */
	}

	sin->sin6_family = PF_INET6;
	sin->sin6_port = htons(PORT);

	if (bind(sock, (struct sockaddr *)sin, sizeof(*sin)) != 0) {
		err(EXIT_FAILURE, "bind");
		/* NOTREACHED */
	}

	return 0;
}
$ cc a.c
$ ./a.out
a.out: bind: Can't assign requested address
$ 

这个问题定位下来就是未初始化,解错了数据

switch (f)
{
    break; case Foo::Alpha:
        s += "is nothing";
    break; case Foo::Beta:
        s += "is important";
        f = Foo::Alpha;
    break; case Foo::Gamma:
        s += "is very important";
        f = Foo::Alpha;
    break; case Foo::Delta:
        s += "is not very important";
        f = Foo::Alpha;
}

哈哈,给我看笑了

#include <experimental/reflect>
#include <iostream>

namespace meta = std::experimental::reflect;

template<class... Ts>
struct print_enum {
  void operator()() {
    ((std::cout << meta::get_name_v<meta::get_type_t<Ts>> << ':' << meta::get_name_v<Ts> << std::endl), ...);
  }
};

enum class Trading { Quant, Lab };

int main() {
  std::cout << meta::get_name_v<reflexpr(Trading)> << std::endl; // prints Trading
  std::cout << meta::get_name_v<reflexpr(Trading::Quant)> << std::endl; // prints Quant
  std::cout << meta::get_name_v<reflexpr(Trading::Lab)> << std::endl; // prints Lab

  meta::unpack_sequence_t<print_enum, meta::get_enumerators_t<reflexpr(Trading)>>{}(); // prints Trading::Quant, Trading::Lab
}

之前说过,这个人的博客权重很高,讲了很多性能优化相关的东西

这里简单列一下

值得一看。看思路

作者说自己的parser库多么多么图灵完备

clang的libc++的deque的push_front在糟糕场景下可能会有O(logN)的效率,注意使用

博客内容是从代码汇编来分析到底耗时在哪里。没有展开看

介绍一些c的莫名其妙的细节,比如include可以当函数,数组是指针别名等等。这里就不展开了。还是不要知道的好

就是实现一个Status错误类型,所有函数都走这个不走异常 接口比较简单,点击直达

视频

cppcon2021出了个视频列表

太多了胖友们,根本看不完。我慢慢消化,可能放在下一期

一个simd实现的算法库,包括find(可以和下面那个简单的比一比),仓库地址

项目

工作招聘

这俩招聘暂时放一个月。主要是没新的

昆仑数据库,魔改mysql的,还支持远程工作,友情推荐一波

现在mysql的代码已经很现代c++了

开发深度学习编译器,而且他们也支持远程工作,c++的,友情推荐一波


本文永久链接

看到这里或许你有建议或者疑问或者指出错误,请留言评论! 多谢! 你的评论非常重要!也可以帮忙点赞收藏转发!多谢支持! 觉得写的不错那就给点吧, 在线乞讨 微信转账