分类目录归档:社区活动

C++技术沙龙报名啦!

唯有技术干货才适合这样装B的场合,不止于走码观花,我们力求在每一个脑洞大开的背后,寻找被忽略的蛛丝码迹,继续我们的脑洞大开运动会,在C/C++的世界里做一个 英姿飒爽的骑士 — 致颜值高得不像实力派的攻城狮们。

主题:技术沙龙 — 牛人码面

时间:2015年12月5日,14:00 — 18:00

地点:金山软件大厦1楼VIP室(广东省珠海市吉大莲山巷8号金山软件大厦(519015) )

沙龙课题

  • 《C++17新特性带来的改善与影响》C++编译器开发工程师,<<深入理解C++11>>(第二版)作者   IBM 吴钊
  • 《Nginx 在windows系统下优化》开源项目 Nginx Openresty For Windows 的发起者,360互联网安全中心 张家柱
  • 《C++中使用golang的协程》实战派C++er大型分布式系统架构设计者 魅族科技 于洋子

内容&讲师介绍:

一、吴钊:IBM XL C++编译器开发工程师,目前主要从事Clang与IBM编译器的融合。对C++语言具有浓烈的兴趣,参与《深入理解C++11》(第二版)的编写,长期活跃于知乎社区C++与编译器板块,ID为蓝色。

内容简介:C++17将会是下一个C++标准,不同于C++14对C++11的小改进,这将会是一个大的标准发布。在该标准中,也将计划引入很多让人兴奋的特性,如有利于改善编译时间的Module System,有利于改善编译器模板错误信息诊断的Concept,文件系统、网络库(基于Boost ASIO)、协程、SIMD等,而我将在此次分享中将着重分享Module System和Concept这两个影响很深远的C++17新特性。

二、于洋子:魅族科技,Linux-C++工程师  在大型分布式系统的设计与开发方面有丰富的经验 魅族用户量百万级走向千万级的见证者。

内容简介:作为C++er的你, 是否曾羡慕golang协程极佳的开发效率,而面对自己异步回调满天飞的代码黯然神伤?是否曾羡慕golang\erlang这种并发语言可以很简单地利用多核CPU,

而对C++多线程编程的复杂性望而却步? 在沙龙分享开源项目cpp_features,帮助你利用C++的高性能的同时获得golang一般的开发效率.

KeyNote:

  1. 同步、异步、协程Demo
  2. C++协程
  3. 协程调度
  4. 阻塞网络IO
  5. 三方库
  6. 语法
  7. 其他特性
  8. 上层封装

三、张家柱:360互联网安全中心,开源项目 Nginx Openresty For Windows 的发起者。

内容简介:

1、概述:
与官网 windows 版本对比
子进程启动方式(主要的差异)
代码差异
2、共享内存
共享内存坑一(无法使用共享内存)&解决方案
共享内存坑二&解决方案
3、性能改进
单进程限制
1024 连接数限制
新的网络模型
大名鼎鼎的 IOCP模型
使用 WSAPoll 模型
4、其他
多实例的支持

报名邮箱:lvxuee@kingsoft.com(来信注明姓名+联系方式+擅长技术或领域)免费报名。

互动奖品:小米自拍杆、运动手环、小米充电宝、wifi放大器、小米音响。

活动流程:

项  目 人 员 时 间 备 注
《C++17新特性带来的改善与影响》 吴钊 14:00-14:50 IBM
下午茶 漂亮MM 14:50-15:00 糕点、水果、咖啡
《Nginx 在windows系统下优化》 张家柱 15:00-15:50 360互联网安全中心
抽奖 漂亮MM 15:50-16:00 试手气
《C++中使用golang的协程》 于洋子 16:00-16:50 魅族科技
圆桌交流 ALL 17:00-17:30 自由交流

填写报名信息:

 

对2015.05技术沙龙中江南群主“任性”故事的探讨

五月份技术沙龙第二场演讲中,江南群主讲述的第二个“任性”故事的一个细节引发了一些争议。经小生仔细观察,三位讲师都有使用到相同的技术,但是实现的方法都有所不同,本文特来对这一个问题做一次详细的研究。

众所周知,在C++中实现反射是一件很棘手的事情。但是在确保没有类型退化(decay)和没有隐式类型转换的干扰下,是用模板元编程的一些技巧可以帮助我们完成一些目标。比如判断某个类型中是否含有某个成员函数,本文中的类成员函数仅指非静态成员函数

现实的基本思想是“一瞥”( catch a glimps of )这个成员函数。一瞥实际上是编译期的某种计算,而不会生成实际的代码。例如非求值运算符( Unevaluated Operator ),重载解析模板特化。非求值运算符在C++98下只有sizeof,到了C++11标准又扩充了decltype,typeid和noexcept三个操作符。先来看看C++98的实现。

由于sizeof只能对类型大小求值,因此C++98的版本的基本思想就是利用SFINAE和重载决议,配合sizeof来计算函数返回类型的大小,而获知哪一个test函数是决议的结果。如果是返回One类型的test,那么可以判断出这个类型T含有命名为foo,返回类型为void且有一个形参为void的成员函数。

这里有两个问题。1. 是否含有成员函数foo,单单只知道成员函数名是不够的,还必须知道它的完整签名,如返回值(暂不考虑cv修饰符)。2. 重载解析的规则里面有讲,相同的形参和不同返回类型的重载函数是有歧义的。因此,我们只需要知道形参就足够了,而不需要知道其完整的签名。

问题一很好解决,就是啰嗦点,除了提供函数名称之外,所有的形参和返回值类型一并提供。在c++98中,想做到这一点更啰嗦。我们需要提供形参数目从1到N每种版本的实现,具体实现多少个N由类库作者自行估量。

第二个问题,我们要寻求其他的实现方法了。因为指向非静态成员函数的指针(pointer to non-static memeber function)的签名有返回值类型,还有cv修饰符。基本思路是,假装我们要调用这个成员函数。先看看实现。

sizeof(((T*)0)->foo()),这一句就是假装去调用这个函数并尝试去计算函数返回值的类型的大小。由于sizeof是非求值运算符,因此没有生成运行期的空指针调用foo的代码。从这里就能看出sizeof操作符已经心有余而力不足了。首先sizeof将类型映射到了类型大小,丢失了类型信息;其次sizeof无法对void求值,这也是这个实现版本的硬伤。总之小生受能力所限,一直无法在cpp98版本中寻求比较好的实现方法。拜求得道大神之不吝赐教。

到了c++11的时代,情况好了许多。decltype这个非求值运算符的出现,让C++98中实现has_member_foo的第二种思路得以实现。先看看实现代码。

基本思想同样是SFINAE和重载解析,配合非求值运算符。只不过换成了delctype运算符。相比于sizeof运算符,decltype保留了非求值表达返回类型的完整信息,更重要的是decltype也能对void计算,不会出现sizeof(void)的尴尬。

深入细节,我们来看看C++11的实现版本是如何一瞥foo的调用的。通常,我们在描述数学问题的时候,总是使用假设。这里类比之,“假设”有一个类型的实例,且“假设”有可列的实参的全部实例,“尝试”使用这些实例调用函数foo,让decltype演绎这次假设的返回值结果!由于decltype是非求值运算符,所以计算中对象不需要真正的实例,同样函数只需要声明而不需要函数体。std::declval就是这样的一个函数。在std命名空间中就是返一个universal reference,并没有函数体。std::decltype只能用于非求值的计算当中。小生认为这种实现是最为简单的,如果使用指向非静态成员函数的指针来实现还要考虑返回值和cv修饰符,而这一种是完全不用考虑的。

接下来扩展一下思路。

拓展思路-另外的实现方法。文章的开头提及到的非求值的编译期计算,除了非求值运算符和重载解析外,还有一个模板特化。那么是否可以通过模板特化来实现本文的需求呢?先来看看基本思路。has_member_foo的泛型实现,应当返回false,继承std::false_type即可。在某种情况下的特化继承std::true_type!听起来是不是很美好?!实现细节。首先,为了简化问题,先不考虑成员函数有形参的情况。元函数has_member_foo的第一个参数是T,要判断的类型,应该是雷打不动的。而我们需要额外的一个参数,为特化的实现所用。

先举一个例子。还记得元函数enable_if配合模板特化的技巧吗?元函数template <typename T> struct size_integral;只计算整形类型的大小,其他类型不做任何计算。看看实现的代码。

当编译器尝试使用某个类型T去实例化size_integral的时候,会实例化所有的特化版本,并决议最佳的匹配。如果T是一个整形,那么特化版本会选择;如果T不是整形,那么特化版本实例化替换失败,根据SFINAE,会匹配泛型的实例化版本。

现在的问题是,针对本文的需求,我们需要一个元函数工具,使得传递任意可列个C++参数类型给它,它始终导出一个void. 为了迎合上面给出的例子的形式,小生才选择void。于是我们构建一个这样的工具,其实现如下。

也有了本文需求的另外一个实现

如果decltype能够成功推导出voider_t中的类型,那么决议就会选择这个more specialized的版本;反之,就会选择泛化的版本。实现是不是更优雅了?使用模板偏特化减少了使用重载解析造成的额外代码,至少小生谨以为然。

只可惜目前的编译器都不支持这种实现,原因是因为voider元函数没有使用任何模板参数,而被编译期做了优化。C++委员会也有一个提案来解决这个问题,详见CWG 1558, treatment of unused arguments in an alias template specialization. 其中的原委,小生还不是很清楚,望闻得道大神指教。

拓展思路-易用性。江南群主在这个故事中也提到了,这个元函数只能针对某一个成员函数,换一个成员函数要重新实现一个,中间有重复代码。因此有了使用宏来生成代码的实现版本,详见江南群主ppt. 可是江南群主的版本必须“两步走”!先得使用宏声明,再使用。有没有什么方法可以使用一个宏就能搞定?经过小生的测试,仅在msvc平台下还有一个小坑,把宏写在函数体内似乎有点问题,始终都找不到这个模板,不知道其他平台如何。因此一定要把宏写在函数体以外。此外,还需要考虑命名空间的问题。其实易用性的实现就目前的C++标准还是有些不够。

鄙文先写到这里。对于C++1y技术感兴趣的同学请加入我们社区,加入QQ群296561497讨论,让C++的世界更美好。

C++技术沙龙主要内容

5月16日技术沙龙有三场主题演讲。

第一场演讲内容:C++11 Make life easier.

第二场演讲内容:玩转编译器,让编译器帮助我们构建“难用错”的类,在大工程批量修改时帮忙查错。

第三场演讲内容:C++的小魔法,使用 ML style pattern matching 轻松应对繁杂的业务逻辑

QQ图片20150508161749

精彩值得期待!!你还在等什么,快来报名吧。liantu

C++技术沙龙报名啦!

沙龙主题:C++魔法
关键字:C++之美,黑科技,神奇和魔力
内容:三场主题演讲和一场开放性话题讨论
时间:2015年5月16日下午2:00-6:00
地点:珠海金山办公软件1楼VIP厅,珠海市吉大景山路莲山巷8号金山软件大厦
参与方式:邀请和报名。报名方式:填写报名信息。

品c++甜点,喝下午茶,论编程之道。
探bit奥秘,舞动指尖,写程序诗篇。

报名需知:请填写真实的电话和姓名,以便我们联系您。入场的时候请携带身份证,验证身份证是为了防止猎头进入,望大家理解。这是一场纯粹的技术盛会!限定名额为40人,报满为止。

QQ图片20150508161749

liantu

 

C++技术大会

主题:C++甜点
关键字:C++的黑科技,神奇和魔力
内容:三场主题演讲和一场开放性话题讨论
时间:五月十六号下午2:00-6:00
地点:珠海金山软件
参与方式:邀请和报名。报名唯一方式:show me your code,代码评审通过即可参加,联系邮箱purecpp@163.com。

C++技术大会值得期待,正所谓:

品c++甜点,喝下午茶,论编程之道。
探bit奥秘,舞动指尖,写程序诗篇。

横批:show me the code

Copy Protected by Chetan's WP-Copyprotect.