<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Vc on I'm OWenT</title><link>//owent.net/tags/vc.html</link><description>Recent content in Vc on I'm OWenT</description><generator>Hugo</generator><language>zh-cn</language><copyright>&lt;a rel="license" href="https://github.com/owent/blog-hugo/blob/master/LICENSE.md"&gt;&lt;img alt="知识共享许可协议" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/80x15.png" /&gt;&lt;/a&gt;</copyright><lastBuildDate>Mon, 08 Jan 2018 17:55:00 +0000</lastBuildDate><atom:link href="//owent.net/tags/vc/index.xml" rel="self" type="application/rss+xml"/><item><title>C++的backtrace</title><link>//owent.net/2018/1801.html</link><pubDate>Mon, 08 Jan 2018 17:55:00 +0000</pubDate><guid>//owent.net/2018/1801.html</guid><description>&lt;h1 id="开始之前"&gt;开始之前&lt;/h1&gt;&#10;&lt;p&gt;很多语言的log模块都有一个功能，就是在打log的时候能够追溯调用栈，有的时候对查bug能有点帮助。之前我也想过给我们的log模块加上C++的backtrace的功能，迟迟一直没有做主要是两个原因：一是C++的backtrace在各个平台和编译器上都不太一样，比较冗杂；二是C/C++在编译优化之后，调用行之类的信息和甚至一些函数可能就被优化没了。所以能提供的信息就相当有限。前两天刚好有朋友问有没有提供这个，所以就花了点时间整理了下适配方案。&lt;/p&gt;</description></item><item><title>libatbus基本功能及单元测试终于写完啦</title><link>//owent.net/2016/1214.html</link><pubDate>Fri, 19 Feb 2016 12:44:53 +0000</pubDate><guid>//owent.net/2016/1214.html</guid><description>&lt;h2 id="libatbus"&gt;&lt;a href="https://github.com/atframework/libatbus"&gt;libatbus&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;经过茫茫长时间的编写+过年在家无聊补充和修正单元测试，再加上这两天的整理，终于把以前的这个关于服务器通信中间件的基本功能和相应的单元测试完成啦。还是可以热烈庆祝一下的。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://www.owent.net/2014/1090.html"&gt;《关于BUS通信系统的一些思考（一）》&lt;/a&gt;&#10;&lt;a href="https://www.owent.net/2014/1099.html"&gt;《关于BUS通信系统的一些思考（二）》&lt;/a&gt;&#10;&lt;a href="https://www.owent.net/2015/1201.html"&gt;《关于BUS通信系统的一些思考（三）》&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;主要的思路还是在自动选择&lt;strong&gt;共享内存&lt;/strong&gt;或是&lt;strong&gt;tcp&lt;/strong&gt;或是&lt;strong&gt;unix socket&lt;/strong&gt;进行通信。使用节点ID，屏蔽底层通信细节，屏蔽自动重连细节和节点之间自动建立直连的细节。同时基于目前的游戏服务器架构设计方式预留了一些拓展性的设计，以便于后续服务器框架的实现。主要是指全异步，树形结构，自动化的容灾设计和动态扩容缩容，不停服更新，统计等等。&lt;/p&gt;</description></item><item><title>[libiniloader] Project</title><link>//owent.net/2014/1081.html</link><pubDate>Mon, 14 Jul 2014 19:28:49 +0000</pubDate><guid>//owent.net/2014/1081.html</guid><description>&lt;h2 id="ini-配置读取库发布"&gt;INI 配置读取库发布&lt;/h2&gt;&#10;&lt;p&gt;Github地址: &lt;a href="https://github.com/owent/libiniloader"&gt;https://github.com/owent/libiniloader&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;OSChina镜像: &lt;a href="http://git.oschina.net/owent/libiniloader"&gt;http://git.oschina.net/owent/libiniloader&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;项目中经常会碰到需要读取配置的情况，而用ini配置最大的优势就是简单易懂。&#10;但是现在很多的配置读取库都过于庞大了，比如Boost.PropertyTree，功能很强大，但是基本不会用到里面所有的东西。&#10;另外微软的INI读取，功能不是很强不说，还限制在Windows上，更重要的是API设计得实在不优雅。&#10;于是libiniloader就诞生啦。&lt;/p&gt;</description></item><item><title>捣鼓一个协程库</title><link>//owent.net/2014/1000.html</link><pubDate>Wed, 05 Mar 2014 21:52:49 +0000</pubDate><guid>//owent.net/2014/1000.html</guid><description>&lt;p&gt;今年准备安安心心写一个协程库。一方面是觉得协程挺有意思，另一方面也是因为C/C++在这方面没有一个非常权威的解决方案。&#10;按照我自己风格还是喜欢C++，所以协程库定名为 libcopp 。&#10;源码托管在 github: &lt;a href="https://github.com/owent/libcopp"&gt;https://github.com/owent/libcopp&lt;/a&gt;&#10;镜像托管 &lt;a href="http://git.oschina.net/owent/distinctionpp"&gt;http://git.oschina.net/owent/distinctionpp&lt;/a&gt;&lt;/p&gt;&#10;&lt;h1 id="首先介绍-什么是协程"&gt;首先介绍: 什么是协程&lt;/h1&gt;&#10;&lt;p&gt;协程(coroutine)，是一种用户态模拟线程的组件。（具体说明参见：&lt;a href="http://zh.wikipedia.org/wiki/%E5%8D%8F%E7%A8%8B"&gt;http://zh.wikipedia.org/wiki/%E5%8D%8F%E7%A8%8B&lt;/a&gt;）&lt;/p&gt;</description></item><item><title>C++11动态模板参数和type_traits</title><link>//owent.net/2014/971.html</link><pubDate>Mon, 27 Jan 2014 16:27:46 +0000</pubDate><guid>//owent.net/2014/971.html</guid><description>&lt;p&gt;C++11标准里有动态模板参数已经是众所周知的事儿了。但是当时还有个主流编译器还不支持。&#10;但是现在，主要的编译器。VC(Windows),GCC(Windows,Linux),Clang(Mac,IOS)都已经支持了。所以就可以准备用于生产环境了。&#10;type_traits没啥好说的。主要是一些静态检测。主要还是要看动态模板参数和他们两的结合使用上。&#10;动态模版参数标准文档见:&#10;&lt;a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2242.pdf"&gt;http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2242.pdf&lt;/a&gt;&#10;和&#10;&lt;a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2555.pdf"&gt;http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2555.pdf&lt;/a&gt;&#10;虽然贴出来了。估计是没人看得。所以就直接说重点。&lt;/p&gt;</description></item><item><title>VC和GCC成员函数指针实现的研究(三)</title><link>//owent.net/2013/902.html</link><pubDate>Wed, 11 Sep 2013 14:57:15 +0000</pubDate><guid>//owent.net/2013/902.html</guid><description>&lt;p&gt;接上一篇 &lt;a href="https://www.owent.net/2013/896.html"&gt;VC和GCC内成员函数指针实现的研究(二)&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 id="虚继承"&gt;虚继承&lt;/h2&gt;&#10;&lt;p&gt;终于到最后的虚继承了。&lt;/p&gt;&#10;&lt;p&gt;测试代码如下:&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-cpp"&gt;#include &amp;lt;ctime&amp;gt;&#13;&#10;#include &amp;lt;vector&amp;gt;&#13;&#10;#include &amp;lt;algorithm&amp;gt;&#13;&#10;#include &amp;lt;cstdio&amp;gt;&#13;&#10;#include &amp;lt;stdint.h&amp;gt;&#13;&#10;#include &amp;lt;cstddef&amp;gt;&#13;&#10;#include &amp;lt;string&amp;gt;&#13;&#10;&#13;&#10;class foo_a&#13;&#10;{&#13;&#10;public:&#13;&#10; virtual ~foo_a(){}&#13;&#10; virtual void info() {&#13;&#10; printf(&amp;#34;%s:%d\n&amp;#34;, __FUNCTION__, __LINE__);&#13;&#10; }&#13;&#10;&#13;&#10; void print(){&#13;&#10; printf(&amp;#34;%s:%d\n&amp;#34;, __FUNCTION__, __LINE__);&#13;&#10; }&#13;&#10;};&#13;&#10;&#13;&#10;class foo_l&#13;&#10;{&#13;&#10;public:&#13;&#10; int l;&#13;&#10; foo_l(): l(1){}&#13;&#10;&#13;&#10; virtual void info() {&#13;&#10; printf(&amp;#34;%s:%d\n&amp;#34;, __FUNCTION__, __LINE__);&#13;&#10; }&#13;&#10;};&#13;&#10;&#13;&#10;class foo_r: virtual public foo_a&#13;&#10;{&#13;&#10;public:&#13;&#10; int r;&#13;&#10; foo_r(): r(2){}&#13;&#10;};&#13;&#10;&#13;&#10;class foo_c: virtual public foo_l, public foo_r&#13;&#10;{&#13;&#10;public:&#13;&#10; virtual void info() {&#13;&#10; printf(&amp;#34;%d,%d. %s:%d\n&amp;#34;, l, r, __FUNCTION__, __LINE__);&#13;&#10; }&#13;&#10;};&#13;&#10;&#13;&#10;&#13;&#10;int main(int argc, char* argv[]) {&#13;&#10; void (foo_a::*vptr1)() = &amp;amp;foo_a::info;&#13;&#10; void (foo_l::*vptr2)() = &amp;amp;foo_l::info;&#13;&#10; void (foo_a::*ptr)() = &amp;amp;foo_a::print;&#13;&#10;&#13;&#10; foo_c c;&#13;&#10; foo_r r;&#13;&#10; foo_a a;&#13;&#10;&#13;&#10; printf(&amp;#34;pword size = %d\n&amp;#34;, (int)(sizeof(size_t)));&#13;&#10; printf(&amp;#34;address of &amp;amp;foo_a::info = 0x%llxH\n&amp;#34;, &amp;amp;foo_a::info);&#13;&#10; printf(&amp;#34;pointer to &amp;amp;foo_a::info = 0x%llxH\n&amp;#34;, vptr1);&#13;&#10; printf(&amp;#34;sizeof vptr = %d\n&amp;#34;, (int)(sizeof(vptr1)));&#13;&#10;&#13;&#10; (a.*vptr1)();&#13;&#10; (r.*vptr1)();&#13;&#10; (c.*vptr1)();&#13;&#10; (c.*vptr2)();&#13;&#10; c.info();&#13;&#10;&#13;&#10; (c.*ptr)();&#13;&#10;&#13;&#10; return 0;&#13;&#10;}&lt;/code&gt;&lt;/pre&gt;&#13;&#10;&lt;h2 id="vc虚继承成员函数指针实现"&gt;VC虚继承成员函数指针实现&lt;/h2&gt;&#10;&lt;p&gt;因为是兼容虚继承和非虚继承的，所以赋值的部分的汇编是一样的。这里就不贴了。关键在于执行期它是怎么找到虚基类的。请往下看：&lt;/p&gt;</description></item><item><title>VC和GCC成员函数指针实现的研究(二)</title><link>//owent.net/2013/896.html</link><pubDate>Wed, 11 Sep 2013 14:44:06 +0000</pubDate><guid>//owent.net/2013/896.html</guid><description>&lt;p&gt;接上一篇 &lt;a href="https://www.owent.net/2013/890.html"&gt;VC和GCC内成员函数指针实现的研究(一)&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;接下来是多重继承，用到的测试代码如下所示:&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-cpp"&gt;#include &amp;lt;ctime&amp;gt;&#13;&#10;#include &amp;lt;vector&amp;gt;&#13;&#10;#include &amp;lt;algorithm&amp;gt;&#13;&#10;#include &amp;lt;cstdio&amp;gt;&#13;&#10;#include &amp;lt;stdint.h&amp;gt;&#13;&#10;#include &amp;lt;cstddef&amp;gt;&#13;&#10;#include &amp;lt;string&amp;gt;&#13;&#10;&#13;&#10;class foo_a&#13;&#10;{&#13;&#10;public:&#13;&#10; virtual ~foo_a(){}&#13;&#10; virtual void info() {&#13;&#10; printf(&amp;#34;%s:%d\n&amp;#34;, __FUNCTION__, __LINE__);&#13;&#10; }&#13;&#10;};&#13;&#10;&#13;&#10;class foo_b&#13;&#10;{&#13;&#10;public:&#13;&#10; virtual ~foo_b(){}&#13;&#10;&#13;&#10; // 这个函数用于试foo_b的结构与foo_a不同&#13;&#10; // 以防止VC对foo_a和foo_b的`vcall&amp;#39;{8}&amp;#39;的代码合并&#13;&#10; virtual void inspect() { &#13;&#10; printf(&amp;#34;%s:%d\n&amp;#34;, __FUNCTION__, __LINE__);&#13;&#10; } &#13;&#10;&#13;&#10; virtual void info() {&#13;&#10; printf(&amp;#34;%s:%d\n&amp;#34;, __FUNCTION__, __LINE__);&#13;&#10; }&#13;&#10;&#13;&#10; void print() {&#13;&#10; printf(&amp;#34;%s:%d\n&amp;#34;, __FUNCTION__, __LINE__);&#13;&#10; }&#13;&#10;};&#13;&#10;&#13;&#10;&#13;&#10;class foo_c: public foo_a, public foo_b&#13;&#10;{&#13;&#10;public:&#13;&#10; virtual void info() {&#13;&#10; printf(&amp;#34;%s:%d\n&amp;#34;, __FUNCTION__, __LINE__);&#13;&#10; }&#13;&#10;};&#13;&#10;&#13;&#10;&#13;&#10;int main(int argc, char* argv[]) {&#13;&#10; void (foo_a::*vptr1)() = &amp;amp;foo_a::info;&#13;&#10; void (foo_b::*vptr2)() = &amp;amp;foo_b::info;&#13;&#10; void (foo_b::*ptr)() = &amp;amp;foo_b::print;&#13;&#10;&#13;&#10; foo_c c;&#13;&#10; foo_b b;&#13;&#10; foo_a a;&#13;&#10;&#13;&#10; &#13;&#10; printf(&amp;#34;word size = %d\n&amp;#34;, (int)(sizeof(size_t)));&#13;&#10; printf(&amp;#34;address of &amp;amp;foo_a::info = 0x%llxH\n&amp;#34;, &amp;amp;foo_a::info);&#13;&#10; printf(&amp;#34;pointer to &amp;amp;foo_a::info = 0x%llxH\n&amp;#34;, vptr1);&#13;&#10; printf(&amp;#34;address of &amp;amp;foo_b::info = 0x%llxH\n&amp;#34;, &amp;amp;foo_b::info);&#13;&#10; printf(&amp;#34;pointer to &amp;amp;foo_b::info = 0x%llxH\n&amp;#34;, vptr2);&#13;&#10; printf(&amp;#34;sizeof vptr = %d\n&amp;#34;, (int)(sizeof(vptr1)));&#13;&#10;&#13;&#10; (a.*vptr1)();&#13;&#10; (b.*vptr2)();&#13;&#10; (c.*vptr1)();&#13;&#10; (c.*vptr2)();&#13;&#10;&#13;&#10; (c.*ptr)();&#13;&#10;&#13;&#10; return 0;&#13;&#10;}&lt;/code&gt;&lt;/pre&gt;&#13;&#10;&lt;h2 id="vc多重继承成员函数指针实现"&gt;VC多重继承成员函数指针实现&lt;/h2&gt;&#10;&lt;p&gt;&lt;img src="//owent.net/2013/p896_img8.png" loading="lazy" /&gt;&lt;/p&gt;</description></item><item><title>VC和GCC内成员函数指针实现的研究(一)</title><link>//owent.net/2013/890.html</link><pubDate>Fri, 06 Sep 2013 12:55:58 +0000</pubDate><guid>//owent.net/2013/890.html</guid><description>&lt;p&gt;最近在《C++对象模型》一书里说到的virtual的成员函数指针，低于128的被cfront编译器认为是虚表偏移量（支持子类对父类函数的覆盖）。VC只是提了下单继承、多继承和虚继承的实现方案不同，GCC没有提及，所以就专门稍微深入分析研究下他们的实现机制。&lt;/p&gt;</description></item></channel></rss>