<?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%87%BD%E6%95%B0%E6%8C%87%E9%92%88.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>Wed, 11 Sep 2013 14:57:15 +0000</lastBuildDate><atom:link href="//owent.net/tags/%E5%87%BD%E6%95%B0%E6%8C%87%E9%92%88/index.xml" rel="self" type="application/rss+xml"/><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>