【美高梅游官网】揭秘C 类中虚表的“神秘面纱

来源:http://www.njdw890.com 作者:美高梅游官网 人气:183 发布时间:2019-10-19
摘要:8月31日下午,NEO游戏大赛颁奖典礼暨BlaCat发布会在上海金茂君悦大酒店成功举办。本次大会由NEL新经济实验室主办,NEOFoundation、NEO MarketInsight(NMI)特别支持,传统游戏和链游行业领袖

8月31日下午,NEO游戏大赛颁奖典礼暨BlaCat发布会在上海金茂君悦大酒店成功举办。本次大会由NEL新经济实验室主办,NEO Foundation、NEO Market Insight(NMI)特别支持,传统游戏和链游行业领袖、海内外开发团队、投资大鳄和行业媒体等近200位嘉宾代表齐聚一堂,共同见证区块链游戏在NEO的落地生根,从无到有,从现在到未来。

揭开C 类中虚表的“神秘面纱”,揭开神秘面纱

  C 类中的虚表结构是C 对象模型中一个重要的知识点,这里咱们就来深入分析下虚表的在内存中的结构。

  C 一个类中有虚函数的话就会有一个虚表指针,其指向对应的虚表,一般一个类只会有一个虚表,每个虚表有多个”插槽”,每个插槽存放一个虚函数的地址。插槽中的内容可以被覆盖,子类如果重写了父类中的虚函数,则插槽中对应位置的数据被覆盖。虚表存放的是虚函数地址,不管该虚函数是public还是private的。光文字说明不太形象,下面上一张虚表结构的示例图:

美高梅游官网 1

 

  从图中看出,虚表指针确实是指向虚表结构的,这个虚表结构中有许多插槽,每个插槽都会指向一个虚函数。那么如何用程序来测试呢,请接着看:

 1 #include <iostream>
 2 #include <cstdio>
 3 
 4 using namespace std;
 5 
 6 class Base {
 7 public:
 8     virtual void test() {
 9         cout << "Base.text()" << endl;
10     }
11 
12 public:
13     int a;
14 };
15 
16 class Derived : public Base {
17 public:
18     virtual void test() {
19         cout << "Derived.test()" << endl;
20     }
21 
22 public:
23     int b;
24 };
25 
26 typedef void (*PFunc)();
27 
28 int main() {
29     Derived derived;
30     PFunc   ptest;   // 函数指针
31 
32     // 输出derived及其成员a/b的地址
33     printf("derived:   %pn", &derived);
34     printf("derived.a: %pn", &(derived.a));
35     printf("derived.b: %pn", &(derived.b));
36 
37     // 提取出test虚函数地址
38     int *p = (int *)*(int *)(&derived);
39     ptest = (PFunc)*p;
40     ptest();
41 
42     return 0;
43 }

输出结果:

美高梅游官网 2

  注意,程序是在Centos 7 64位系统下进行测试的。程序中直接提取出test虚函数地址,然后进行调用,发现调用的确实是Derived.test函数,这也说明了虚表结构的内存布局。

 

本次大会上半场为NEO区块链游戏开发大赛颁奖典礼,有八款参赛作品进入到决赛,并由评委嘉宾授予奖项。下半场为NEO链游平台BlaCat发布会,平台创始人陈喜在现场首次公开演示了BlaCat各项功能和技术特点。

关于虚表几个有意思的问题

虚表指针什么时候赋值的?

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 class Base
 6 {
 7 public:
 8     Base() {
 9         cout << "Base()" << endl;
10         show();
11         int *p = &b;
12         cout << "Base::b: " << p << endl;
13         p = (int *)((char *)p - 8);
14         cout << "Base::vptr: " << *p << endl;
15         // Base中虚函数地址
16         cout << "*Base::vptr: " << *(int *)*p << endl;
17         cout << endl;
18     }
19 
20     virtual void show() {
21         cout << "Base::show()" << endl;
22     }
23 public:
24     int b;
25 };
26 class Derived : public Base
27 {
28 public:
29     Derived()
30     {
31         cout << "Derived()" << endl;
32         show();
33         int *p = &b;
34         cout << "Derived::b: " << p << endl;
35         p = (int *)((char *)p - 8);
36         cout << "Derived::vptr: " << *p << endl;
37         // Derived中虚函数地址
38         cout << "*Derived::vptr: " << *(int *)*p << endl;
39         cout << endl;
40     }
41     virtual void show() {
42         cout << "Derived::show()" << endl;
43     }
44 private:
45     int d;
46 };
47 
48 int main(int argc, char **argv)
49 {
50     Base base;
51     Derived derived;
52 
53     return 0;
54 }

输出结果为:

美高梅游官网 3

从输出结果中可以得出,子类在构造过程中虚表指针会被赋值2次。初始化如下:

  基类静态成员 – 子类静态成员 – (设置v_ptr/基类成员变量 ) –基类构造函数 – (设置v_ptr/子类成员变量) – 子类构造函数

 

在类的析构函数中是否对虚表指针进行赋值操作呢?

  在子类的析构函数中,会把虚表指针设置为指向父类中的虚函数地址,这样在父类的析构函数中调用虚函数实际上调用的是父类的虚函数,不过一般不这样做。如何进行测试呢,按照上个问题的测试代码,然后稍微改动一下就可以测试了。

 

参考:

  1、深入理解C 对象模型

  2、《深度探索C 对象模型》

C 类中的虚表结构是C 对象模型中一个重要的知识点,这里咱们就来深入分析下虚表的在内...

美高梅游官网 4

NEO游戏大赛颁奖典礼暨BlaCat发布会现场

大会上半场:NEO游戏大赛决赛,八强选手登台路演

在总决赛现场,从248位参赛者39个入围项目中脱颖而出的八强选手首次登台路演,面对台下九位权威评审和近两百位现场嘉宾的挑剔目光,他们该如何应对和表现,评委又将如何评判,且看最终结果:

1) 技术效果奖——《卡莱战纪》

《卡莱战纪》是一款高度融合区块链技术特点,玩法完全原创的构建式卡牌对战游戏,并且游戏做到了两项第一:第一款模拟拜占庭问题的链游,第一款去中心化投票小说链游。项目开发“诺链团队”来自于海外,这款全链作品一定程度上展现了NEO海外社区开发者在技术层面的深厚理解和运用。

2) 设计效果奖——《我的天空》

《我的天空》是一款竖版设计类游戏,飞机设计精巧组合多样化,链上产出,关卡耐玩性强。玩家通过飞行射击赢得链上飞机资产,飞机可以在链上升级合成交易,实现仅仅通过游戏行为让游戏资产升值的梦想。这款游戏还加强了社交元素,玩家可以在游戏过程里和其他玩家聊天,随时掌握世界信息。

3) 视觉效果奖——《重装魔女•矩阵》

《重装魔女•矩阵》是一款基于区块链的休闲轻竞技游戏,其核心为策略类的卡牌回合制战斗玩法。玩家在游戏中可以加入公会,在公会模式中挑战BOSS享受“战斗即挖矿”的乐趣,除了能赚钱,游戏还在颜值上下了很大功夫,游戏中担当画师的都是业内很出名且较为特色的,比如参与过崩坏3人设设计,碧蓝航线,战舰少女R等原画设计的SA等人。

4) 商业价值奖——《荣耀足球》

《荣耀足球》是一款将数字资产运行在区块链合约上的足球游戏,游戏中玩家可以经营自己的足球俱乐部,开放给其他玩家进行比赛进行抽水,普通用户可以通过参与经营的行为中获取数字资产货币。据悉,游戏前身是一款月流水百万的H5游戏,这次将深度改造上链进军区块链领域。

5) 游戏创意奖——《细胞进化》

《细胞进化》是第一款基于区块链的去中心化的沙盒策略游戏,所有的玩家扮演一个细胞族群。在这个族群里,我们需要平衡我们总体的适应性,生存性与繁殖性。当我们的细胞族群的方向失衡,我们整体将会进化失败。这不仅仅是个游戏,也是个真正的社会群体实验。《细胞进化》曾获得500万元人民币联合投资,是国内首款区块链价值获得资本认可的游戏。

6) 艺术大奖——《NEO.Girl》

美高梅游官网 5

魔橙网络创始人兼CEO陈敏涛为《细胞进化》团队代表颁奖

《NEO.Girl》的前作是《VR女友》,两款游戏都由银月网络开发。《VR女友》已在传统游戏领域获得了巨大成功,拥有数以千万的粉丝群体,这次开发《NEO.Girl》一方面是对前作内容的升级和更新,另一方面结合了区块链技术,将游戏内经济系统与区块链紧密结合,让玩家可以达到赚点小钱养女友的目的。

7)区块链大奖——《区块链领主》

美高梅游官网 6

NGC创始合伙人朱威宇为《区块链领主》团队代表颁奖

《区块链领主》是本届NEO游戏大赛首个入围作品,开发团队是从游族网络出来创业的,本次参赛虽然以国内团队报名,但事实上成员以老外居多。这是一款与区块链技术深度结合的在线战争策略类游戏,玩家可以在游戏中培养独特的英雄,攻击敌对NPC,旅行并征服不同的城市,买卖装备道具,攻击其他国家的玩家或者在本国掀起一场叛乱。

8)最佳游戏大奖&最受欢迎奖——《CardMaker》

美高梅游官网 7

NEO创始人兼核心开发者张铮文为《CardMaker》团队代表颁奖

在本次大会举办前一周,《CardMarker》便以9223票的网络票选数量摘得NEO游戏大赛最受欢迎奖,之后在九位评委把关的评审阶段更是从其他七位大奖候选中强势突围,一举夺得最佳游戏大奖。至此,《CardMarker》获网络大众和专业评委一致认可,双冠王的称号当之无愧。

《CardMarker》是一款创造性的UGC游戏,诞生于不久前的2018 GameJam独立游戏大赛。玩家不仅可以设计卡牌,还可以高自由度的设计角色、关卡、剧情,甚至跨链和应用接入。弱中心确权机制会带来频繁互动,某个玩家的创作同时给其他用户提供了鉴赏,贸易和谜题。开发者仅创造框架,将设计全交给了玩家,智能合约和通证经济可以提供完美的创作激励和价值保证,就如NEO一样。

美高梅游官网 8

首届NEO区块链游戏大赛九大奖项开发者合照

大会下半场:BlaCat发布会,创始人陈喜畅谈新生态

大会现场,NEO链上首个游戏平台——BlaCat揭开神秘面纱,创始人陈喜首先与台下来宾分享了他对区块链游戏行业当下的思考和未来的展望,随后针对行业痛点提出了BlaCat的解决方案:1)BlaCat SDK为玩家提供嵌入式轻钱包,无需下载专用浏览器和插件;2)基于NEO的多链结构高速侧链ZoroChain,解决产品上链的拥堵问题。

美高梅游官网 9

BlaCat创始人陈喜正在台上演讲

最后,BlaCat创始人陈喜表示,BlaCat链游平台将在未来半年到一年之内落地成熟,而这需要游戏开发者,甚至整个行业一起推动,因为如果没有开发者提供游戏DApp,那么BlaCat SDK和ZoroChain将无用武之地,而相对地开发者的游戏DApp需要这两项技术的支撑,所以BlaCat链游平台希望能和游戏开发者产生良性的互动,找到一个双方共赢的模式,加速NEO游戏生态建设步伐,让链游时代真正地走进大众生活。

据悉,目前BlaCat链游平台正与NEO游戏大赛获奖团队商定入驻协议,一旦达成协议前者将在平台上线初期获得数量可观,且品质优秀的游戏DApp保驾护航。

美高梅游官网 10

BlaCat链游平台首批入驻游戏列表(拟邀)

本文由美高梅游官网发布于美高梅游官网,转载请注明出处:【美高梅游官网】揭秘C 类中虚表的“神秘面纱

关键词: 美高梅游官网

最火资讯