文档章节

C#和C/C++混合编程系列2-内存管理

梦想游戏人
 梦想游戏人
发布于 07/09 21:11
字数 402
阅读 67
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

2篇前置博文:

Http服务器-第十步加入基于Mono平台的C#脚本支持     https://my.oschina.net/kkkkkkkkkkkkk/blog/4322402

架构9-引入C#混合编程-服务端概述       https://my.oschina.net/kkkkkkkkkkkkk/blog/4335583

 

C#自带GC算法在独立使用时无需额外处理,cpp的话各种内存管理技术也很多如智能指针。

在这里混合编程下,c#层作为脚本使用时,很容易在cpp层书写核心代码,几乎2倍内存的消耗,但是这个不是本文的重点,本文阐述他们之间的内存关系和混合管理方式。这里的方案是cpp层通过handle来指向c#,c#端进行handle和实际的对象的引用。下面通过案例来阐述这种方式。

 

C#层


public class GameObject : object
{
    private long _native_handle;//cpp ptr for
};


//提供全局c# 对象 c++引用
static class CppReferenceInternal
{
    public static Dictionary<int, object> global_cpp_ref = new Dictionary<int, object>();
    public static void Retain(object obj)
    {
        int hash = obj.GetHashCode();
        if (global_cpp_ref.ContainsKey(hash) == false)
        {
            global_cpp_ref.Add(hash, obj);
        }
    }
    public static void Release(object obj)
    {
        int hash = obj.GetHashCode();
        if (global_cpp_ref.ContainsKey(hash))
        {
            global_cpp_ref.Remove(hash);
        }
    }
}

 

C++层

class GameObject
	{
	public:
		static GameObject*Create()
		{
			GameObject *ret = new GameObject();
			return ret;
		};
		GameObject()
		{
			AllocMonoObject();
		}
		~GameObject()
		{
			FreeMonoObject();
		}
	private:
		bool FreeMonoObject()
		{
			MonoObjectRelease(mono_object_handle);
			mono_object_handle = nullptr;
			return true;
		}
		bool AllocMonoObject()
		{
			MonoClass *cls = mono_class_from_name(mono_assembly_get_image(mono_stick_engine_dll), "", "GameObject");
			mono_object_handle = mono_object_new(vm, cls);
			//call default ctor
			mono_runtime_object_init(mono_object_handle);

			MonoObjectRetatin(mono_object_handle);
			return true;
		}
	private:
		MonoObject * mono_object_handle = nullptr;
	};

这里只是其中一种管理方式的基本示例。

 

梦想游戏人
粉丝 44
博文 505
码字总数 200978
作品 0
成都
私信 提问
加载中
请先登录后再评论。
Flappy Bird(安卓版)逆向分析(一)

更改每过一关的增长分数 反编译的步骤就不介绍了,我们直接来看反编译得到的文件夹 方法1:在smali目录下,我们看到org/andengine/,可以知晓游戏是由andengine引擎开发的。打开/res/raw/at...

enimey
2014/03/04
6K
18
树莓派(Raspberry Pi):完美的家用服务器

自从树莓派发布后,所有在互联网上的网站为此激动人心的设备提供了很多有趣和具有挑战性的使用方法。虽然这些想法都很棒,但树莓派( RPi )最明显却又是最不吸引人的用处是:创建你的完美家用...

异次元
2013/11/09
6.9K
8
DNS 管理系统--NamedManager

NamedManager 是一个基于 Web 的 DNS 管理系统,可用来添加、调整和删除 DNS 的 zones/records 数据,支持 Bind 作为后端的 DNS 服务,支持 IPv4 和 IPv6。...

匿名
2013/01/23
8.8K
0
C++模板库--C++ B-tree

这是一个google开源的C++模板库,实现了基于B-tree数据结构的有序内存容器。类似于STL的map、set、multimap和multiset模板,C++ B-tree也提供了btreemap、btreeset、btreemultimap和btreemu...

匿名
2013/02/05
3.4K
1
研究虚拟机--Jikes RVM

Jikes研究虚拟机(Jikes Research Virtual Machine,简称Jikes RVM)是一种成熟的用于执行Java程序的虚拟机,其早期版本与当前版本分别在通用公共许可证(CPL)与Eclipse公共许可证(EPL)下开...

匿名
2013/02/13
1.1K
0

没有更多内容

加载失败,请刷新页面

加载更多

如何在Git历史记录中grep(搜索)已提交的代码 - How to grep (search) committed code in the Git history

问题: I have deleted a file or some code in a file sometime in the past. 我过去某个时候已经删除了文件或文件中的某些代码。 Can I grep in the content (not in the commit messages)......

技术盛宴
15分钟前
9
0
二进制安装安装mysql 8.0.20

MySQL最新版本8.0.20正式发布。与之前8.0的系列版本一样,这次的发行版除了包含缺陷修复,也同样包括新功能。下面快速浏览一下。关键字:hash join、InnoDB双写缓冲、二进制日志事务压缩。 ...

程序员面试吧
19分钟前
13
0
关于python3.8+ pyside2 pyinstaller打包的一些坑

环境: python 3.8 pyinstaller 3.6 pyside2 5.14 打包过程中出现错误(1):   7607 WARNING: lib not found: pywintypes38.dll dependency of c:\users\have_\appdata\local\programs\pyth......

齐勇cn
19分钟前
11
0
备战秋招!静电的UI设计教室全能课程开始招生~系统进阶!提升核心竞争力

。 本文分享自微信公众号 - 静Design(JingDesign91)。 如有侵权,请联系 support@oschina.cn 删除。 本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。...

静电1983
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部