<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>c&#43;&#43; on Bad Fd</title>
    <link>/categories/c&#43;&#43;/</link>
    <description>Recent content in c&#43;&#43; on Bad Fd</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh-cn</language>
    <lastBuildDate>Wed, 24 Mar 2021 00:00:00 +0000</lastBuildDate><atom:link href="/categories/c++/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>enable_shared_from_this的实现和CRTP Idiom</title>
      <link>/posts/c&#43;&#43;_enable_shared_from_this%E7%9A%84%E5%AE%9E%E7%8E%B0%E5%92%8Ccrtp-idiom/</link>
      <pubDate>Wed, 24 Mar 2021 00:00:00 +0000</pubDate>
      
      <guid>/posts/c&#43;&#43;_enable_shared_from_this%E7%9A%84%E5%AE%9E%E7%8E%B0%E5%92%8Ccrtp-idiom/</guid>
      <description></description>
    </item>
    
    <item>
      <title>parameter pack和递归模板展开</title>
      <link>/posts/c&#43;&#43;_template_parameter_pack/</link>
      <pubDate>Wed, 24 Mar 2021 00:00:00 +0000</pubDate>
      
      <guid>/posts/c&#43;&#43;_template_parameter_pack/</guid>
      <description>&lt;h2 id=&#34;需求&#34;&gt;需求&lt;/h2&gt;
&lt;p&gt;做一个libevent的wrapper，有个需求，用户对某个fd的可读事件感兴趣，要求在产生这个事件时，调用他传入的某个可调用对象及其参数。
libevent的回调类似：&lt;code&gt;void LibeventCallback(int fd, short flag, void* arg);&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;要求：
1、用户传入的可调用对象fn，拿的参数是可变的，第一个参数为某个特定类型，用于感知fd和flag，后续其他为用户自定义参数&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>recall of memory order model</title>
      <link>/posts/c&#43;&#43;_recall-of-memory-order-model/</link>
      <pubDate>Tue, 09 Mar 2021 00:00:00 +0000</pubDate>
      
      <guid>/posts/c&#43;&#43;_recall-of-memory-order-model/</guid>
      <description>&lt;h2 id=&#34;c内存序&#34;&gt;c++内存序&lt;/h2&gt;
&lt;h2 id=&#34;题外话&#34;&gt;题外话&lt;/h2&gt;
&lt;h4 id=&#34;cache-coherency-vs-memory-consistency&#34;&gt;Cache Coherency vs. Memory Consistency&lt;/h4&gt;
&lt;p&gt;这两个概念容易混淆，重新捋一下。&lt;/p&gt;
&lt;p&gt;关于Cache Coherency：&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>c&#43;&#43; notes：recall of move-semantics and rvalue-reference (2)</title>
      <link>/posts/cppnotes-move-semantics-n-rvalue-reference-2/</link>
      <pubDate>Wed, 03 Feb 2021 00:00:00 +0000</pubDate>
      
      <guid>/posts/cppnotes-move-semantics-n-rvalue-reference-2/</guid>
      <description>&lt;p&gt;回顾：&lt;/p&gt;
&lt;p&gt;G1-G4:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;G1&lt;/code&gt;.
If a variable or parameter is declared to have type T&amp;amp;&amp;amp; for some deduced type T, that variable or parameter is a universal reference.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;G2&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    
    <item>
      <title>c&#43;&#43; notes：recall of move-semantics and rvalue-reference (1)</title>
      <link>/posts/cppnotes-move-semantics-n-rvalue-reference-1/</link>
      <pubDate>Tue, 02 Feb 2021 00:00:00 +0000</pubDate>
      
      <guid>/posts/cppnotes-move-semantics-n-rvalue-reference-1/</guid>
      <description>&lt;p&gt;几年前，整理了一份rvalue相关笔记：&lt;a href=&#34;https://zhuanlan.zhihu.com/p/111826434&#34;&gt;以前的一份笔记&lt;/a&gt;，梳理近况时，发现某些问题还是没有弄清楚。&lt;/p&gt;
&lt;h2 id=&#34;universal-reference&#34;&gt;&lt;code&gt;Universal Reference&lt;/code&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Q: 什么场景下需要考虑这个问题？
A：模板元编程时，需要考虑兼容各种传入参数类型时（尤其是『左值/右值』）。基本上我感觉就是为了处理完美转发问题。比如写一个工厂函数模板，需要同时兼容传入的参数是左值和右值的情况，核心点是一个右值无法用于初始化一个左值引用，c++11之前要解决这个问题，要么写很多重复偏特化模板，要么付出拷贝参数的代价。&lt;/p&gt;
&lt;p&gt;c++11引入右值引用之后，上述问题可以通过&lt;code&gt;universal reference&lt;/code&gt;来解决，即传入参数是左值时，形参的类型推导为左值引用，是右值时，推导为右值引用，同时只需要提供一套模板即可。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Q: 什么是&lt;code&gt;Universal Reference&lt;/code&gt;?
A: 形如&lt;code&gt;T&amp;amp;&amp;amp;&lt;/code&gt;, &lt;code&gt;T&lt;/code&gt;不含有任何的cv限定符, 且&lt;code&gt;T&lt;/code&gt;需要被推导&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;G1&lt;/code&gt;.
If a variable or parameter is declared to have type T&amp;amp;&amp;amp; for some deduced type T, that variable or parameter is a universal reference.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    
    <item>
      <title>c&#43;&#43;服务端rpc笔记：读muduo有感</title>
      <link>/posts/cppnote-server_rpc_notes/</link>
      <pubDate>Sat, 01 Dec 2018 21:26:49 +0800</pubDate>
      
      <guid>/posts/cppnote-server_rpc_notes/</guid>
      <description>&lt;p&gt;最近比较详细地缕了一遍公司内部另一个团队的存储产品（基于apache thrift），后简称为A。到目前为止，本团队存储产品自研的rpc框架，加上自己写过一个简单rpc框架用于rdb实例分裂，已经接触了3个rpc框架。准备在这篇文章总结下一些个人感想。&lt;/p&gt;
&lt;h3 id=&#34;连接处理模型&#34;&gt;连接处理模型&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A的服务端：使用thrift-rpc的nonblock-server，连接处理模型是同步的：
a. io线程在收到一个包后，会先把自己设为idle（具体点就是摘掉本线程上的可读写事件），扔给worker线程处理完成后再加回来。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A的cli端的处理是同步的：&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    
    <item>
      <title>c&#43;&#43;服务端rpc笔记：读muduo有感</title>
      <link>/posts/cppnotes-server_rpc_notes/</link>
      <pubDate>Sat, 01 Dec 2018 21:26:49 +0800</pubDate>
      
      <guid>/posts/cppnotes-server_rpc_notes/</guid>
      <description>&lt;p&gt;最近比较详细地缕了一遍公司内部另一个团队的存储产品（基于apache thrift），后简称为A。到目前为止，本团队存储产品自研的rpc框架，加上自己写过一个简单rpc框架用于rdb实例分裂，已经接触了3个rpc框架。准备在这篇文章总结下一些个人感想。&lt;/p&gt;
&lt;h3 id=&#34;连接处理模型&#34;&gt;连接处理模型&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A的服务端：使用thrift-rpc的nonblock-server，连接处理模型是同步的：
a. io线程在收到一个包后，会先把自己设为idle（具体点就是摘掉本线程上的可读写事件），扔给worker线程处理完成后再加回来。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A的cli端的处理是同步的：&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    
    <item>
      <title>智能指针1: shared_ptr使用梳理</title>
      <link>/posts/cppnotes-shared_ptr/</link>
      <pubDate>Sat, 01 Dec 2018 21:26:49 +0800</pubDate>
      
      <guid>/posts/cppnotes-shared_ptr/</guid>
      <description>&lt;p&gt;本文提及并讨论了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;shared_ptr&lt;/code&gt;引入背景&lt;/li&gt;
&lt;li&gt;删除器&lt;/li&gt;
&lt;li&gt;线程安全性&lt;/li&gt;
&lt;li&gt;&lt;code&gt;std::ref&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    
    <item>
      <title>c&#43;&#43;笔记：STL容器迭代器失效场景</title>
      <link>/posts/cppnotes-iterator-invalidation/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/posts/cppnotes-iterator-invalidation/</guid>
      <description>&lt;h2 id=&#34;cheatsheet&#34;&gt;CheatSheet&lt;/h2&gt;
&lt;p&gt;(完整版见下面 Ref1 or cppref)
note:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;顺序型容器&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;deque插入or删除操作会导致迭代器失效.&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    
    <item>
      <title>c&#43;&#43;笔记：STL相关</title>
      <link>/posts/cppnotes-stl-misc/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/posts/cppnotes-stl-misc/</guid>
      <description>this is a post of misc items of stl.
  behavior of operator[] of vector and map:
  auto in for-statement:
   </description>
    </item>
    
  </channel>
</rss>
