<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>内存实现 on I'm OWenT</title><link>//owent.net/tags/%E5%86%85%E5%AD%98%E5%AE%9E%E7%8E%B0.html</link><description>Recent content in 内存实现 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>Sun, 23 Apr 2017 23:48:54 +0000</lastBuildDate><atom:link href="//owent.net/tags/%E5%86%85%E5%AD%98%E5%AE%9E%E7%8E%B0/index.xml" rel="self" type="application/rss+xml"/><item><title>libatbus的几个藏得很深的bug</title><link>//owent.net/2017/1411.html</link><pubDate>Sun, 23 Apr 2017 23:48:54 +0000</pubDate><guid>//owent.net/2017/1411.html</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;在写这篇文章前，我突然想到以前流行了一段时间的服务器面试题：当一个BUG只有几百万分之一的概率会出现，怎么办？这个问题在这个BUG里只是毛毛雨而已，因为这次的BUG的&lt;strong&gt;出现概率是夸张的三亿分之一&lt;/strong&gt;。&lt;/p&gt;</description></item><item><title>小记最近踩得两个C++坑</title><link>//owent.net/2015/1189.html</link><pubDate>Sat, 25 Jul 2015 14:53:44 +0000</pubDate><guid>//owent.net/2015/1189.html</guid><description>&lt;h1 id="小记最近踩得两个c坑"&gt;小记最近踩得两个C++坑&lt;/h1&gt;
&lt;!-- toc --&gt;
&lt;p&gt;记一下最近踩得两个C++独有的暗坑，其中一个和ABI相关。第二个坑其实之前研究过，但是没有实例，这次算是碰到了个典型的实例。&lt;/p&gt;
&lt;h2 id="坑一常量引用失效"&gt;坑一：常量引用失效&lt;/h2&gt;
&lt;p&gt;在项目中碰到的实例的大致流程是:&lt;/p&gt;</description></item><item><title>C++又一坑:动态链接库中的全局变量</title><link>//owent.net/2014/962.html</link><pubDate>Sat, 04 Jan 2014 17:30:32 +0000</pubDate><guid>//owent.net/2014/962.html</guid><description>&lt;p&gt;前几天我们项目的日志系统出现了一点问题，但是一直没有时间去深究。
昨天在同事的帮助下，无意中猜了一种可能性，结果还真被我猜中了，于是今天就特别研究了一下，记录下来。&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;
&lt;h2 id="虚继承"&gt;虚继承&lt;/h2&gt;
&lt;p&gt;终于到最后的虚继承了。&lt;/p&gt;
&lt;p&gt;测试代码如下:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-cpp"&gt;#include &lt;ctime&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;
#include &lt;cstdio&gt;
#include &lt;stdint.h&gt;
#include &lt;cstddef&gt;
#include &lt;string&gt;

class foo_a
{
public:
 virtual ~foo_a(){}
 virtual void info() {
 printf("%s:%d\n", __FUNCTION__, __LINE__);
 }

 void print(){
 printf("%s:%d\n", __FUNCTION__, __LINE__);
 }
};

class foo_l
{
public:
 int l;
 foo_l(): l(1){}

 virtual void info() {
 printf("%s:%d\n", __FUNCTION__, __LINE__);
 }
};

class foo_r: virtual public foo_a
{
public:
 int r;
 foo_r(): r(2){}
};

class foo_c: virtual public foo_l, public foo_r
{
public:
 virtual void info() {
 printf("%d,%d. %s:%d\n", l, r, __FUNCTION__, __LINE__);
 }
};


int main(int argc, char* argv[]) {
 void (foo_a::*vptr1)() = &amp;foo_a::info;
 void (foo_l::*vptr2)() = &amp;foo_l::info;
 void (foo_a::*ptr)() = &amp;foo_a::print;

 foo_c c;
 foo_r r;
 foo_a a;

 printf("pword size = %d\n", (int)(sizeof(size_t)));
 printf("address of &amp;foo_a::info = 0x%llxH\n", &amp;foo_a::info);
 printf("pointer to &amp;foo_a::info = 0x%llxH\n", vptr1);
 printf("sizeof vptr = %d\n", (int)(sizeof(vptr1)));

 (a.*vptr1)();
 (r.*vptr1)();
 (c.*vptr1)();
 (c.*vptr2)();
 c.info();

 (c.*ptr)();

 return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="vc虚继承成员函数指针实现"&gt;VC虚继承成员函数指针实现&lt;/h2&gt;
&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;
&lt;p&gt;接下来是多重继承，用到的测试代码如下所示:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-cpp"&gt;#include &lt;ctime&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;
#include &lt;cstdio&gt;
#include &lt;stdint.h&gt;
#include &lt;cstddef&gt;
#include &lt;string&gt;

class foo_a
{
public:
 virtual ~foo_a(){}
 virtual void info() {
 printf("%s:%d\n", __FUNCTION__, __LINE__);
 }
};

class foo_b
{
public:
 virtual ~foo_b(){}

 // 这个函数用于试foo_b的结构与foo_a不同
 // 以防止VC对foo_a和foo_b的`vcall'{8}'的代码合并
 virtual void inspect() { 
 printf("%s:%d\n", __FUNCTION__, __LINE__);
 } 

 virtual void info() {
 printf("%s:%d\n", __FUNCTION__, __LINE__);
 }

 void print() {
 printf("%s:%d\n", __FUNCTION__, __LINE__);
 }
};


class foo_c: public foo_a, public foo_b
{
public:
 virtual void info() {
 printf("%s:%d\n", __FUNCTION__, __LINE__);
 }
};


int main(int argc, char* argv[]) {
 void (foo_a::*vptr1)() = &amp;foo_a::info;
 void (foo_b::*vptr2)() = &amp;foo_b::info;
 void (foo_b::*ptr)() = &amp;foo_b::print;

 foo_c c;
 foo_b b;
 foo_a a;

 
 printf("word size = %d\n", (int)(sizeof(size_t)));
 printf("address of &amp;foo_a::info = 0x%llxH\n", &amp;foo_a::info);
 printf("pointer to &amp;foo_a::info = 0x%llxH\n", vptr1);
 printf("address of &amp;foo_b::info = 0x%llxH\n", &amp;foo_b::info);
 printf("pointer to &amp;foo_b::info = 0x%llxH\n", vptr2);
 printf("sizeof vptr = %d\n", (int)(sizeof(vptr1)));

 (a.*vptr1)();
 (b.*vptr2)();
 (c.*vptr1)();
 (c.*vptr2)();

 (c.*ptr)();

 return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="vc多重继承成员函数指针实现"&gt;VC多重继承成员函数指针实现&lt;/h2&gt;
&lt;p&gt;&lt;img src="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>