进阶C++,本科可以直接读博士吗《Effective Modern C++》吗

读《Effective Modern C++》2 years ago这样的语法已经不再是梦。3. 利弊。解决了原有问题后会不会带来什么新问题,会不会和已有特性冲突。4. 案例。重申动机,举例子证明新设计的有效性。这四点其实在标准提案中都有了。图书和黑板报除了这些内容,一般还会增加一个最佳实践,就是说一个特性应该怎么用,不应该怎么用。这些最佳实践都是大佬们开会讨论、大牛们反复吃屎得来宝贵经验,汇集了各种常用情况和corner case的应对,这是集体智慧的结晶,是此类图书的精髓,是读其他材料很难收获到的东西。当然,最佳实践不一定要贯彻进工程实践中。举个例子,异常就有很多最佳实践,比如怎么去最小化抛出异常的成本,怎么避免异常带来的内存泄漏。但是很多工程实践中,直接就禁止了异常的使用,一劳永逸,阿弥陀佛,我的上帝,阿克拉 ... 。但是了解最佳实践是非常重要的,因为有时候,最佳实践,真的就是非常好用的最佳实践。都有nullptr了,劳什子还要处理int和T*的重载在面对NULL实参时候所存在的潜在危险呢?都有shared_ptr的衣服穿了,还什么理由还要指针裸奔呢?最后,吐槽还是要吐槽的。最佳实践一直都是C++最坑人的部分,光几本书加一起就有好几百条了,谁记得住啊。例如当年Meyers一再重申,Deconstructor不能抛出异常!不能抛出异常!不能抛出异常!然后写了三五页纸来阐述为什么。我也不记得为什么了,反正这是铁律,执行就是了。到C++11,一群人开会一合计,觉得当年是不是脑洞开得太大了。构造的时候,借内存借资源借不到,析构的时候还内存还资源也不让还了吗!那有还人钱还还不成的道理!于是标准中,干脆就让delete不放异常,析构函数默认noexcept。真要挂了那也是逆天行事,干脆听天由命吧。-------------------------------------------------------------------------------------------------------最后,重要的话说三遍:0(以上都是吐槽,正经内容请自行看书)1(以上都是吐槽,正经内容请自行看书)2(以上都是吐槽,正经内容请自行看书)3(以上都是吐槽,正经内容请自行看书)127收藏分享举报文章被以下专栏收录图形处理器与C++专栏推荐阅读{&debug&:false,&apiRoot&:&&,&paySDK&:&https:\u002F\\u002Fapi\u002Fjs&,&wechatConfigAPI&:&\u002Fapi\u002Fwechat\u002Fjssdkconfig&,&name&:&production&,&instance&:&column&,&tokens&:{&X-XSRF-TOKEN&:null,&X-UDID&:null,&Authorization&:&oauth c3cef7c66aa9e6a1e3160e20&}}{&database&:{&Post&:{&&:{&isPending&:false,&contributes&:[{&sourceColumn&:{&lastUpdated&:,&description&:&新版专栏开启自由投稿后本专栏接受图形硬件技术相关的投稿。\n\n专栏名由来:http:\u002F\\u002Fsildenafil\u002F&,&permission&:&COLUMN_PUBLIC&,&memberId&:855790,&contributePermission&:&COLUMN_PUBLIC&,&translatedCommentPermission&:&all&,&canManage&:true,&intro&:&图形处理器与C++专栏&,&urlToken&:&sildenafil&,&id&:4916,&imagePath&:&5877bca31d92cff0ceb215.jpg&,&slug&:&sildenafil&,&applyReason&:&&,&name&:&蓝色小药丸&,&title&:&蓝色小药丸&,&url&:&https:\u002F\\u002Fsildenafil&,&commentPermission&:&COLUMN_ALL_CAN_COMMENT&,&canPost&:true,&created&:,&state&:&COLUMN_NORMAL&,&followers&:9677,&avatar&:{&id&:&5877bca31d92cff0ceb215&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&},&activateAuthorRequested&:false,&following&:false,&imageUrl&:&https:\u002F\\u002F5877bca31d92cff0ceb215_l.jpg&,&articlesCount&:49},&state&:&accepted&,&targetPost&:{&titleImage&:&&,&lastUpdated&:,&imagePath&:&&,&permission&:&ARTICLE_PUBLIC&,&topics&:[],&summary&:&因为前段时间为了写《C++模板进阶指南》看了大部分C++11的标准,所以就顺带着读了一下《Effective Modern C++》和GotW查漏补缺。虽然我现在读这本书已经不像当年读《Effective C++》和 《More Effective C++》的中译本那样兴奋了,因为大部分内容都已经知道…&,&copyPermission&:&ARTICLE_COPYABLE&,&translatedCommentPermission&:&all&,&likes&:0,&origAuthorId&:855790,&publishedTime&:&T16:35:36+08:00&,&sourceUrl&:&&,&urlToken&:,&id&:344220,&withContent&:false,&slug&:,&bigTitleImage&:false,&title&:&读《Effective Modern C++》&,&url&:&\u002Fp\u002F&,&commentPermission&:&ARTICLE_ALL_CAN_COMMENT&,&snapshotUrl&:&&,&created&:,&comments&:0,&columnId&:4916,&content&:&&,&parentId&:0,&state&:&ARTICLE_PUBLISHED&,&imageUrl&:&&,&author&:{&bio&:&资深吊丝,职业傻逼。&,&isFollowing&:false,&hash&:&d073f194bcabc1cec5ef69d0b534de99&,&uid&:60,&isOrg&:false,&slug&:&wuye9036&,&isFollowed&:false,&description&:&资深吊丝,职业傻逼。&,&name&:&空明流转&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fwuye9036&,&avatar&:{&id&:&ff88fd8ddff4&,&template&:&https:\u002F\\u002F50\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},&memberId&:855790,&excerptTitle&:&&,&voteType&:&ARTICLE_VOTE_CLEAR&},&id&:308679}],&title&:&读《Effective Modern C++》&,&author&:&wuye9036&,&content&:&因为前段时间为了写《C++模板进阶指南》看了大部分C++11的标准,所以就顺带着读了一下《Effective Modern C++》和GotW查漏补缺。\u003Cp\u003E虽然我现在读这本书已经不像当年读《Effective C++》和 《More Effective C++》的中译本那样兴奋了,因为大部分内容都已经知道了。但是对于一些特殊情况,和一些被整理出来的特殊用法,还是有一种哎哟卧槽的感觉,比如讲using的那个Item,还有对于auto\u002Fdeclexpr\u002Ftype deducing的解释。\u003C\u002Fp\u003E\u003Cp\u003E其实整个Effective系列的成书,都是Meyers从社区搜刮来的。C++的八卦来源有很多,比较常见的是C++ Lang新闻组,标准委员会的定期会议以及被整理成册的标准提案,以及成员们自己写的博客(比如Sutter的黑板报,GotW)。\u003C\u002Fp\u003E\u003Cp\u003E这些材料,都可以归纳为:\u003C\u002Fp\u003E\u003Cp\u003E1. 动机。一个Feature被提出来是为了解决什么痛点的;比如override就是为了处理一些看起来很像的函数的误覆盖。\u003C\u002Fp\u003E\u003Cp\u003E2. 语法。C++好用的语法已经被榨干净了,所以接下来的新特性要怎么从一堆垃圾里面刨能用的语法出来就是看点。你看[[attribute]]这个就忒神奇了。我觉得\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E{{{{{{ What the fuck }}}}}}\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E这样的语法已经不再是梦。\u003C\u002Fp\u003E\u003Cp\u003E3. 利弊。解决了原有问题后会不会带来什么新问题,会不会和已有特性冲突。\u003C\u002Fp\u003E\u003Cp\u003E4. 案例。重申动机,举例子证明新设计的有效性。\u003C\u002Fp\u003E\u003Cp\u003E这四点其实在标准提案中都有了。图书和黑板报除了这些内容,一般还会增加一个\u003Cb\u003E最佳实践\u003C\u002Fb\u003E,就是说一个特性应该怎么用,不应该怎么用。这些最佳实践都是大佬们开会讨论、大牛们反复吃屎得来宝贵经验,汇集了各种常用情况和corner case的应对,这是集体智慧的结晶,是此类图书的精髓,是读其他材料很难收获到的东西。\u003C\u002Fp\u003E\u003Cp\u003E当然,最佳实践不一定要贯彻进工程实践中。举个例子,异常就有很多最佳实践,比如怎么去最小化抛出异常的成本,怎么避免异常带来的内存泄漏。但是很多工程实践中,直接就禁止了异常的使用,一劳永逸,阿弥陀佛,我的上帝,阿克拉 ... 。\u003C\u002Fp\u003E\u003Cp\u003E但是了解最佳实践是非常重要的,因为有时候,最佳实践,真的就是非常好用的最佳实践。都有nullptr了,劳什子还要处理int和T*的重载在面对NULL实参时候所存在的潜在危险呢?都有shared_ptr的衣服穿了,还什么理由还要指针裸奔呢?\u003C\u002Fp\u003E\u003Cp\u003E最后,吐槽还是要吐槽的。\u003C\u002Fp\u003E\u003Cp\u003E最佳实践一直都是C++最坑人的部分,光几本书加一起就有好几百条了,谁记得住啊。例如当年Meyers一再重申,Deconstructor不能抛出异常!不能抛出异常!不能抛出异常!然后写了三五页纸来阐述为什么。我也不记得为什么了,反正这是铁律,执行就是了。到C++11,一群人开会一合计,觉得当年是不是脑洞开得太大了。构造的时候,借内存借资源借不到,析构的时候还内存还资源也不让还了吗!那有还人钱还还不成的道理!于是标准中,干脆就让delete不放异常,析构函数默认noexcept。\u003C\u002Fp\u003E\u003Cp\u003E真要挂了那也是逆天行事,干脆听天由命吧。\u003C\u002Fp\u003E\u003Cp\u003E-------------------------------------------------------------------------------------------------------\u003C\u002Fp\u003E\u003Cp\u003E最后,重要的话说三遍:\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E0(以上都是吐槽,正经内容请自行看书)\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E1(以上都是吐槽,正经内容请自行看书)\u003Cbr\u003E\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E2(以上都是吐槽,正经内容请自行看书)\u003Cbr\u003E\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E3(以上都是吐槽,正经内容请自行看书)\u003C\u002Fb\u003E\u003C\u002Fp\u003E&,&updated&:new Date(&T08:35:36.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:20,&collapsedCount&:0,&likeCount&:127,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&titleImage&:&&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&reviewers&:[],&topics&:[],&adminClosedComment&:false,&titleImageSize&:{&width&:0,&height&:0},&href&:&\u002Fapi\u002Fposts\u002F&,&excerptTitle&:&&,&column&:{&slug&:&sildenafil&,&name&:&蓝色小药丸&},&tipjarState&:&inactivated&,&annotationAction&:[],&sourceUrl&:&&,&pageCommentsCount&:20,&hasPublishingDraft&:false,&snapshotUrl&:&&,&publishedTime&:&T16:35:36+08:00&,&url&:&\u002Fp\u002F&,&lastestLikers&:[{&bio&:&;-)&,&isFollowing&:false,&hash&:&fda3cb6b514c7c0fd46ae64e9fd83ffe&,&uid&:344450,&isOrg&:false,&slug&:&ya-feng-45&,&isFollowed&:false,&description&:&码农&,&name&:&哑枫&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fya-feng-45&,&avatar&:{&id&:&f5cc41db4b366bcaf96d83d&,&template&:&https:\u002F\\u002F50\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:&&,&isFollowing&:false,&hash&:&33710b62defb&,&uid&:867100,&isOrg&:false,&slug&:&deathallows&,&isFollowed&:false,&description&:&当你回首往事&,&name&:&Deathallows&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fdeathallows&,&avatar&:{&id&:&v2-ccae51d3536a&,&template&:&https:\u002F\\u002F50\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:&HFer&,&isFollowing&:false,&hash&:&5fd9f715b3f7cb&,&uid&:414100,&isOrg&:false,&slug&:&chen-qi-22-14-47&,&isFollowed&:false,&description&:&&,&name&:&陈淇&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fchen-qi-22-14-47&,&avatar&:{&id&:&da8e974dc&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:&it技术牛人&,&isFollowing&:false,&hash&:&f419ea9c07b2b1bde99b44a43c0037f1&,&uid&:729900,&isOrg&:false,&slug&:&bian-fu-41-16&,&isFollowed&:false,&description&:&&,&name&:&蝙蝠&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fbian-fu-41-16&,&avatar&:{&id&:&da8e974dc&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:&战忽局特约研究员&,&isFollowing&:false,&hash&:&2aea817b5c026e257d6bbd4e2bfd0435&,&uid&:36,&isOrg&:false,&slug&:&liusicheng2008&,&isFollowed&:false,&description&:&踏实做人,热爱生活&,&name&:&往事随风2008&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fliusicheng2008&,&avatar&:{&id&:&v2-91d6bd2381513aca5f06bcbe051b4d8d&,&template&:&https:\u002F\\u002F50\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false}],&summary&:&因为前段时间为了写《C++模板进阶指南》看了大部分C++11的标准,所以就顺带着读了一下《Effective Modern C++》和GotW查漏补缺。虽然我现在读这本书已经不像当年读《Effective C++》和 《More Effective C++》的中译本那样兴奋了,因为大部分内容都已经知道…&,&reviewingCommentsCount&:0,&meta&:{&previous&:{&isTitleImageFullScreen&:false,&rating&:&none&,&titleImage&:&https:\u002F\\u002F50\u002Fb966c7dfb5db6ce9abf0_xl.jpg&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&topics&:[],&adminClosedComment&:false,&href&:&\u002Fapi\u002Fposts\u002F&,&excerptTitle&:&&,&author&:{&bio&:&资深吊丝,职业傻逼。&,&isFollowing&:false,&hash&:&d073f194bcabc1cec5ef69d0b534de99&,&uid&:60,&isOrg&:false,&slug&:&wuye9036&,&isFollowed&:false,&description&:&资深吊丝,职业傻逼。&,&name&:&空明流转&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fwuye9036&,&avatar&:{&id&:&ff88fd8ddff4&,&template&:&https:\u002F\\u002F50\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},&column&:{&slug&:&sildenafil&,&name&:&蓝色小药丸&},&content&:&\u003Cp\u003E\u003Cb\u003E前言\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E这篇文章的内容不重要。\u003C\u002Fp\u003E\u003Cp\u003E中心思想是:我也是个会发表情的开山怪。\u003C\u002Fp\u003E\u003Cp\u003E-------------------------------------------\u003C\u002Fp\u003E昨天是值得纪念的一天。十年来我第一次写出了Goto;下午还修了一台卡纸的激光打印机。晚上为了一个Bug在公司折腾到快一点钟,还惊动了邹老师在我朋友圈留言关心。\u003Cp\u003E问题是这样的,跑个程序不是要打Log吗。然后就写了一段代码:\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-c\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Estream\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Efopen\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EfileName\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&s\&\u003E\&wb\&\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E);\u003C\u002Fspan\u003E\n\u003Cspan class=\&n\&\u003Efwrite\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E&\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Ea\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&k\&\u003Esizeof\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&kt\&\u003Eint\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E),\u003C\u002Fspan\u003E \u003Cspan class=\&mi\&\u003E1\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Estream\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E);\u003C\u002Fspan\u003E\n\u003Cspan class=\&n\&\u003Efwrite\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E&\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eb\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&k\&\u003Esizeof\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&kt\&\u003Eint\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E),\u003C\u002Fspan\u003E \u003Cspan class=\&mi\&\u003E1\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Estream\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E);\u003C\u002Fspan\u003E\n\u003Cspan class=\&n\&\u003Efwrite\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E&\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Ec\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&k\&\u003Esizeof\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&kt\&\u003Eint\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E),\u003C\u002Fspan\u003E \u003Cspan class=\&mi\&\u003E1\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Estream\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E);\u003C\u002Fspan\u003E\n\u003Cspan class=\&n\&\u003Efflush\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Estream\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E);\u003C\u002Fspan\u003E\n\u003Cspan class=\&c1\&\u003E\u002F\u002F write other data\u003C\u002Fspan\u003E\n\u003Cspan class=\&n\&\u003Efclose\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Estream\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E);\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E然后文件写出来后就用某Hex Viewer工具看一下二进制文件写的对不对。这段代码两次被调用,分别是不同的文件。\u003C\u002Fp\u003E\u003Cp\u003E第一个文件写出去,打开,无比正常。第二个文件写出去后一打开,艾玛,数据不对啊。比如说我明明写的是:\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E10 00 00 00 00 02 00 00 00 02 00 00\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E但是文件打开后变成了:\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E10 00 04 00 3c a5 b7 00 a9 02 00\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cimg src=\&http:\u002F\\u002F8cbe3c8ce_b.jpg\& data-rawwidth=\&177\& data-rawheight=\&184\& class=\&content_image\& width=\&177\&\u003E\u003Cbr\u003E\u003Cp\u003E首先,怀疑程序错了嘛,然后挂调试器,咦,a对的啊,b对的啊,c对的啊。执行到fflush,再看一看结果:\u003C\u002Fp\u003E\u003Cimg src=\&http:\u002F\\u002Fc041fabbe4e_b.jpg\& data-rawwidth=\&233\& data-rawheight=\&217\& class=\&content_image\& width=\&233\&\u003E\u003Cp\u003E其次,是不是栈写崩了?继续断点,进入fwrite内部。跟到Buffer,还是对的嘛。再回头看看文件内容:\u003C\u002Fp\u003E\u003Cimg src=\&http:\u002F\\u002F6d489e0db6f436c35fdeb50d270a042c_b.jpg\& data-rawwidth=\&173\& data-rawheight=\&135\& class=\&content_image\& width=\&173\&\u003E\u003Cp\u003E那就再跟得深一点?到了Windows API:WriteFile。这个后面没有Symbol,跟踪不下去了。检查了一下WriteFile的各项参数,返回值,一切正常。再去看看文件内容:\u003C\u002Fp\u003E\u003Cimg src=\&http:\u002F\\u002Ffa0afba4f360edd425d877c23e388f5d_b.jpg\& data-rawwidth=\&263\& data-rawheight=\&191\& class=\&content_image\& width=\&263\&\u003E\u003Cp\u003E这个时候我开始进入脑洞模式:\u003C\u002Fp\u003E\u003Cp\u003E1. 是不是Kernel挂了,这个要用WinDbg去看。2. 是不是反病毒软件拦截了文件的Write? 3. 是不是其它什么未知原因导致的?\u003C\u002Fp\u003E\u003Cp\u003E然后重启电脑,全新编译。运行了一刻钟后,打开文件一看:\u003C\u002Fp\u003E\u003Cimg src=\&http:\u002F\\u002Fbdb1eee78ded8dd81cae4bef_b.jpg\& data-rawwidth=\&221\& data-rawheight=\&228\& class=\&content_image\& width=\&221\&\u003E\u003Cp\u003E没关系,再次执行一次看看:fwrite,fwrite,fwrite,fflush。用查看器打开文件。\u003C\u002Fp\u003E\u003Cp\u003E还是不对。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E是不对。\u003C\u002Fp\u003E\u003Cp\u003E不对。\u003C\u002Fp\u003E\u003Cp\u003E对。\u003C\u002Fp\u003E\u003Cp\u003E咦?我操?\u003C\u002Fp\u003E\u003Cp\u003E最后一个字节怎么在0x0000000a的位置啊?这特么不一共11个字节么?打开文件浏览器,右键属性,上面妥妥的写着,Size:12 bytes。\u003C\u002Fp\u003E\u003Cp\u003E然后我从网上重新下载了一个Hex的查看器,打开,把文件拖进去。\u003C\u002Fp\u003E\u003Cimg src=\&http:\u002F\\u002Fc2d45abded_b.png\& data-rawwidth=\&267\& data-rawheight=\&189\& class=\&content_image\& width=\&267\&\u003E\u003Cp\u003E终于对了。再一看时间,快十二点了。\u003C\u002Fp\u003E\u003Cimg src=\&http:\u002F\\u002Fb966c7dfb5db6ce9abf0_b.jpg\& data-rawwidth=\&259\& data-rawheight=\&195\& class=\&content_image\& width=\&259\&\u003E\u003Cbr\u003E\u003Cp\u003E\u003Cb\u003E完。\u003C\u002Fb\u003E\u003C\u002Fp\u003E&,&state&:&published&,&sourceUrl&:&&,&pageCommentsCount&:0,&canComment&:false,&snapshotUrl&:&&,&slug&:,&publishedTime&:&T11:00:51+08:00&,&url&:&\u002Fp\u002F&,&title&:&记一段WTF的Debug经历&,&summary&:&\u003Cb\u003E前言\u003C\u002Fb\u003E这篇文章的内容不重要。中心思想是:我也是个会发表情的开山怪。-------------------------------------------昨天是值得纪念的一天。十年来我第一次写出了Goto;下午还修了一台卡纸的激光打印机。晚上为了一个Bug在公司折腾到快一点钟,还惊动了邹老师…&,&reviewingCommentsCount&:0,&meta&:{&previous&:null,&next&:null},&commentPermission&:&anyone&,&commentsCount&:39,&likesCount&:138},&next&:{&isTitleImageFullScreen&:false,&rating&:&none&,&titleImage&:&&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&topics&:[],&adminClosedComment&:false,&href&:&\u002Fapi\u002Fposts\u002F&,&excerptTitle&:&&,&author&:{&bio&:&资深吊丝,职业傻逼。&,&isFollowing&:false,&hash&:&d073f194bcabc1cec5ef69d0b534de99&,&uid&:60,&isOrg&:false,&slug&:&wuye9036&,&isFollowed&:false,&description&:&资深吊丝,职业傻逼。&,&name&:&空明流转&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fwuye9036&,&avatar&:{&id&:&ff88fd8ddff4&,&template&:&https:\u002F\\u002F50\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},&column&:{&slug&:&sildenafil&,&name&:&蓝色小药丸&},&content&:&\u003Cp\u003E此文是写\u003Ca href=\&http:\u002F\\u002F?target=https%3A\\u002FwuyeFCppTemplateTutorial\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E《C++模板进阶指南》\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E中多出来的一段。删掉觉得可惜,也许以后用得上就先放在这里了。\u003C\u002Fp\u003E\u003Cp\u003E-------------------------------------------------\u003C\u002Fp\u003E\u003Cp\u003E多态(Polymorphism)是一个大家耳熟能详的概念。在传统的C++教学中,我们通常认为“多态”是函数在类继承体系中所表现出来的一种行为。比如,在下面的例子中,\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-cpp\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&k\&\u003Etemplate\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E&\u003C\u002Fspan\u003E\u003Cspan class=\&k\&\u003Etypename\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003ET\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E&\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003ET\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EconvertFromInt\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&kt\&\u003Eint\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Ev\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E);\u003C\u002Fspan\u003E\n\u003Cspan class=\&kt\&\u003Evoid\u003C\u002Fspan\u003E \u003Cspan class=\&nf\&\u003Ef1\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E()\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E{\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003EconvertFromInt\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E&\u003C\u002Fspan\u003E\u003Cspan class=\&kt\&\u003Efloat\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E&\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&mi\&\u003E5\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E);\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003EconvertFromInt\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E&\u003C\u002Fspan\u003E\u003Cspan class=\&kt\&\u003Edouble\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E&\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&mi\&\u003E5\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E);\u003C\u002Fspan\u003E\n\u003Cspan class=\&p\&\u003E}\u003C\u002Fspan\u003E\n\n\u003Cspan class=\&k\&\u003Estruct\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EBase\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E{\u003C\u002Fspan\u003E \n
\u003Cspan class=\&k\&\u003Evirtual\u003C\u002Fspan\u003E \u003Cspan class=\&kt\&\u003Evoid\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EdoWork\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E()\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E{\u003C\u002Fspan\u003E\n
\u003Cspan class=\&c1\&\u003E\u002F\u002F blah blah blah\u003C\u002Fspan\u003E\n
\u003Cspan class=\&p\&\u003E}\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Evirtual\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E~\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EBase\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E()\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E{}\u003C\u002Fspan\u003E\n\u003Cspan class=\&p\&\u003E};\u003C\u002Fspan\u003E\n\n\u003Cspan class=\&k\&\u003Estruct\u003C\u002Fspan\u003E \u003Cspan class=\&nl\&\u003EDerived\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\&k\&\u003Epublic\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EBase\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E{\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Evirtual\u003C\u002Fspan\u003E \u003Cspan class=\&kt\&\u003Evoid\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EdoWork\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E()\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E{\u003C\u002Fspan\u003E\n
\u003Cspan class=\&c1\&\u003E\u002F\u002F blah blah blah 2\u003C\u002Fspan\u003E\n
\u003Cspan class=\&p\&\u003E}\u003C\u002Fspan\u003E\n\u003Cspan class=\&p\&\u003E};\u003C\u002Fspan\u003E\n\n\u003Cspan class=\&kt\&\u003Evoid\u003C\u002Fspan\u003E \u003Cspan class=\&nf\&\u003Ef2\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(){\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003EBase\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E*\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Ep\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&k\&\u003Enew\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EDerived\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E();\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Ep\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E-&\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EdoWork\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E();\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Edelete\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Ep\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E;\u003C\u002Fspan\u003E\n\u003Cspan class=\&p\&\u003E}\u003C\u002Fspan\u003E\n\n\u003Cspan class=\&kt\&\u003Evoid\u003C\u002Fspan\u003E \u003Cspan class=\&nf\&\u003EAdd\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&kt\&\u003Eint\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&kt\&\u003Eint\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E);\u003C\u002Fspan\u003E\n\u003Cspan class=\&kt\&\u003Evoid\u003C\u002Fspan\u003E \u003Cspan class=\&nf\&\u003EAdd\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&kt\&\u003Edouble\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&kt\&\u003Edouble\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E);\u003C\u002Fspan\u003E\n\u003Cspan class=\&kt\&\u003Evoid\u003C\u002Fspan\u003E \u003Cspan class=\&nf\&\u003Ef3\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(){\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003EAdd\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&mi\&\u003E15\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&mi\&\u003E17\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E);\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003EAdd\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&mf\&\u003E1.56\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&mf\&\u003E2.28\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E);\u003C\u002Fspan\u003E\n\u003Cspan class=\&p\&\u003E}\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E我们通常只认为`f2()`中的行为是由多态机制决定的。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E然而,在更广阔的计算机领域中,多态这个词并不只是局限在类继承和虚函数上。只要是同名函数能够根据参数的类型不同而获得不同的实现,我们都可以叫它“多态”。\u003C\u002Fp\u003E\u003Cp\u003E多态可以分成三类,Ad hoc 多态(Ad hoc ~),参数化多态(Parametric ~),子类型多态(Subtype ~)。\u003C\u002Fp\u003E\u003Cp\u003E对于Ad hoc多态,首先要神会这个词,我个人通常将其简单替换成 ”The fucking“,“那个多态”。C++中的重载,例子中的函数 f3() 就属于此类。多个同名函数根据参数的不同,选择不同的实现。第二种的典型例子,就是例子中的f1(),通过参数化类型来完成多态。第三种,局限于多态化的函数参数类型是Subtyping的关系,它是C++上狭义的多态。\u003C\u002Fp\u003E\u003Cp\u003E参考:\u003C\u002Fp\u003E\u003Cp\u003E\u003Ca href=\&http:\u002F\\u002F?target=https%3A\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPolymorphism_%28computer_science%29\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EPolymorphism (computer science)\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E&,&state&:&published&,&sourceUrl&:&&,&pageCommentsCount&:0,&canComment&:false,&snapshotUrl&:&&,&slug&:,&publishedTime&:&T14:58:09+08:00&,&url&:&\u002Fp\u002F&,&title&:&多态&,&summary&:&此文是写\u003Ca href=\&https:\\u002FwuyeFCppTemplateTutorial\& data-editable=\&true\& data-title=\&《C++模板进阶指南》\& class=\&\&\u003E《C++模板进阶指南》\u003C\u002Fa\u003E中多出来的一段。删掉觉得可惜,也许以后用得上就先放在这里了。-------------------------------------------------多态(Polymorphism)是一个大家耳熟能详的概念。在传统的C++教学中,我们通常认为“多态”是函数在类继承体…&,&reviewingCommentsCount&:0,&meta&:{&previous&:null,&next&:null},&commentPermission&:&anyone&,&commentsCount&:4,&likesCount&:57}},&annotationDetail&:null,&commentsCount&:20,&likesCount&:127,&FULLINFO&:true}},&User&:{&wuye9036&:{&isFollowed&:false,&name&:&空明流转&,&headline&:&资深吊丝,职业傻逼。&,&avatarUrl&:&https:\u002F\\u002F50\u002Fff88fd8ddff4_s.jpg&,&isFollowing&:false,&type&:&people&,&slug&:&wuye9036&,&bio&:&资深吊丝,职业傻逼。&,&hash&:&d073f194bcabc1cec5ef69d0b534de99&,&uid&:60,&isOrg&:false,&description&:&资深吊丝,职业傻逼。&,&badge&:{&identity&:null,&bestAnswerer&:{&topics&:[{&type&:&topic&,&id&:&&,&name&:&计算机图形学&},{&type&:&topic&,&id&:&&,&name&:&C++&},{&type&:&topic&,&id&:&&,&name&:&编程&}],&description&:&优秀回答者&}},&profileUrl&:&https:\u002F\\u002Fpeople\u002Fwuye9036&,&avatar&:{&id&:&ff88fd8ddff4&,&template&:&https:\u002F\\u002F50\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false}},&Comment&:{},&favlists&:{}},&me&:{},&global&:{&experimentFeatures&:{&ge3&:&ge3_9&,&ge2&:&ge2_1&,&nwebStickySidebar&:&sticky&,&androidPassThroughPush&:&getui&,&newMore&:&new&,&liveReviewBuyBar&:&live_review_buy_bar_2&,&liveStore&:&ls_a2_b2_c1_f2&,&searchHybridTabs&:&without-tabs&,&isOffice&:&false&,&homeUi2&:&default&,&answerRelatedReadings&:&qa_recommend_with_ads_and_article&,&remixOneKeyPlayButton&:&headerButton&,&asdfadsf&:&asdfad&,&qrcodeLogin&:&qrcode&,&newBuyBar&:&livenewbuy3&,&isShowUnicomFreeEntry&:&unicom_free_entry_off&,&newMobileColumnAppheader&:&new_header&,&zcmLighting&:&zcm&,&favAct&:&default&,&appStoreRateDialog&:&close&,&mobileQaPageProxyHeifetz&:&m_qa_page_nweb&,&iOSNewestVersion&:&4.2.0&,&default&:&None&,&wechatShareModal&:&wechat_share_modal_show&,&qaStickySidebar&:&sticky_sidebar&,&androidProfilePanel&:&panel_b&,&nwebWriteAnswer&:&default&}},&columns&:{&next&:{},&sildenafil&:{&following&:false,&canManage&:false,&href&:&\u002Fapi\u002Fcolumns\u002Fsildenafil&,&name&:&蓝色小药丸&,&creator&:{&slug&:&wuye9036&},&url&:&\u002Fsildenafil&,&slug&:&sildenafil&,&avatar&:{&id&:&5877bca31d92cff0ceb215&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&}}},&columnPosts&:{},&columnSettings&:{&colomnAuthor&:[],&uploadAvatarDetails&:&&,&contributeRequests&:[],&contributeRequestsTotalCount&:0,&inviteAuthor&:&&},&postComments&:{},&postReviewComments&:{&comments&:[],&newComments&:[],&hasMore&:true},&favlistsByUser&:{},&favlistRelations&:{},&promotions&:{},&draft&:{&titleImage&:&&,&titleImageSize&:{},&isTitleImageFullScreen&:false,&canTitleImageFullScreen&:false,&title&:&&,&titleImageUploading&:false,&error&:&&,&content&:&&,&draftLoading&:false,&globalLoading&:false,&pendingVideo&:{&resource&:null,&error&:null}},&drafts&:{&draftsList&:[],&next&:{}},&config&:{&userNotBindPhoneTipString&:{}},&recommendPosts&:{&articleRecommendations&:[],&columnRecommendations&:[]},&env&:{&edition&:{},&isAppView&:false,&appViewConfig&:{&content_padding_top&:128,&content_padding_bottom&:56,&content_padding_left&:16,&content_padding_right&:16,&title_font_size&:22,&body_font_size&:16,&is_dark_theme&:false,&can_auto_load_image&:true,&app_info&:&OS=iOS&},&isApp&:false},&message&:{&newCount&:0},&pushNotification&:{&newCount&:0}}

我要回帖

更多关于 股市进阶之道在线阅读 的文章

 

随机推荐