新的C++特点平衡了把托管堆的地址传递到非托管代码的能力。早期我们遇到的最大问题是,在托管堆中的对象的位置是非静态的。垃圾收集器以变化的时间间隔移动对象。现在新的pin_ptr(别针型指针)的引入禁止垃圾收集器改变在堆上的对象的地址。

  下面代码展示了别针型指针的应用。

#pragma unmanaged
//本机函数,以整型指针作参数,执行计算
void calc(int* val)
{
 //执行计算操作
}
#pragma managed
//托管函数调用本机calc函数
int managedfunc()
{
 int i=gcnew int(10);
 //把i的地址设置为别针型,以阻止对i的移动
 pin_ptr<int> ppi=&i;
 int* np=ppi;
 calc(np);//用别针型int的地址调用本机函数
 //把别针型指针的值置为nullptr,脱离了gc的限制
 ppi=nullptr;
 //完成剩下的工作
 return i;
}

  基于轮廓的优化(Profile Guided Optimization)

  在新版本的托管C++中有一项新增功能称为基于轮廓的优化。这一新的编译特点能够实现在编译时刻把探针注入到代码中。最后的exe文件与一个数据库一起打包发送,由该库记录下注入代码中的探针监测到的结果数据。当用户运行该程序时,这些探针记录下应用程序的使用。当你下一次再编译时,编译器作出智能性决策,如根据探针的记录作为相应的动作。这一特性带来了真实世界的优化。

  为什么没有为使用托管类型而定义头文件?

   在传统的C++中,一个头文件一般包含对象的接口,或者类与函数的声明,等等。这允许在多个翻译单元上实现某种类型的一致性声明。对于一个用托管代码编 写的且其被编译成MSIL的对象,需要在配件集中包含描述对象的元数据。因而,托管C++编译器不是通过头文件,而是通过使用配件集元数据来实现接口的读 取。这就是为什么你不必因使用托管类型而包含头文件。事实上,你可以通过使用#using指令来让编译器从配件集中读取元数据。

C++/CLI思辨录之传递托管堆地址相关推荐

  1. C++/CLI思辨录之Object的对象布局

    C++/CLI相对纯C++来说,支持创建托管引用对象,托管对象由虚拟机来分配内存和管理,程序员可以不再担心内存泄漏的问题.其实,说白了也就是相当于自己创建一个内存池,并且虚拟机实际上也是这样做的. 在 ...

  2. C++/CLI思辨录之内部指针的两面性

    在本文中,我将解释为什么使用本地指针来管理对象.原因在于对象是以垃圾收集器移动的.所以,当对象移动时,本地指针就变成无效的.所以,如果你想取得一个托管对象的本地指针,你就会遇到一个编译错.下面的代码显 ...

  3. C++/CLI思辨录之代理构造函数

    现在我们讨论一下新的C++/CLI环境下的一个很酷的特性,称作代理构造函数. 对一个类来说,有多个构造函数是经常的事:并且这多个构造函数有一段共同的代码也很经常.一般地,在这种情况下,我们都是为该共同 ...

  4. C++/CLI思辨录之再谈继承

    在面向对象编程领域一个关键的概念是继承. 在OO和C++中,类成员共有三种级别的继承:public,protected和private.对于基类成员的存取操作应该依赖于下面两个因素: ·派生类声明其类 ...

  5. 栈和托管堆/值类型和引用类型/强制类型转换/装箱和拆箱[C#]

    一.栈和托管堆 通用类型系统(CTS)区分两种基本类型:值类型和引用类型.它们之间的根本区别在于它们在内存中的存储方式..NET使用两种不同的物理内存块来存储数据-栈和托管堆.如下图所示:     值 ...

  6. new,is和as运算符解析及运行时类型,对象,线程堆栈,托管堆之间的联系

    CLR要求对象必须使用new运算符创建,在使用new运算符创建一个对象时具体都做了些什么呢? 1.计算所有定义的实例字段,所有的基类型包括System.Object需要分配的字节数. 每一个堆上的对象 ...

  7. 【CLR】解析CLR的托管堆和垃圾回收

    目录结构: contents structure [+] 为什么使用托管堆 从托管堆中分配资源 托管堆中的垃圾回收 垃圾回收算法 代 垃圾回收模式 垃圾回收触发条件 强制垃圾回收 监视内存 对包装了本 ...

  8. Unity 内存优化之理解托管堆和本机堆

    https://docs.unity3d.com/Manual/BestPracticeUnderstandingPerformanceInUnity4-1.html https://www.dazh ...

  9. 【转】堆栈和托管堆 c#

    原文地址:http://blog.csdn.net/baoxuetianxia/archive/2008/11/04/3218913.aspx 首先堆栈和堆(托管堆)都在进程的虚拟内存中.(在32位处 ...

最新文章

  1. LiveVideoStack线上分享第三季(二):对话机器人与儿童电子消费品
  2. php数组无限文类,php把无限级分类生成数组的类
  3. ElasticSearch学习(一):Linux环境准备
  4. 技术分享|Javascript高级教程学习指南
  5. java 元胞自动机_元胞自动机 Java实现
  6. Java 将Word转为OFD
  7. [境内法规]中国人民银行关于防范利用假美元洗钱的通知—银发[2006]第60号
  8. 《微观经济学》第五章弹性及其应用
  9. Rmarkdown教程
  10. arcos的matlab定义,想用matlab解一个带arccos的方程。可是结果好像没有解析解。求帮助解数值解...
  11. Java中多个pdf文件合并为一个
  12. OpenGL:gl_ClipDistance和gl_CullDiatance
  13. 输入一个大于3的整数n,判定它是否为素数。例题5.9
  14. fbx sdk android,FBX SDK环境配置
  15. 让你的搜索变得精致——启发式搜索
  16. HTML 文本域textarea
  17. 简报悦读:教育部取消5类高考加分项目,猿辅导纪录片讲述十年坚守
  18. 英语对我们意味着什么?
  19. java四个数打擂,荐 C/C++/Java/Go/Rust,Python喊你来打擂:3秒钟内统计出小于1亿的素数个数...
  20. 中本聪论文_浏览器中本机智能卡支持的案例

热门文章

  1. 2022年全球及中国医用口服硫酸钡行业规模格局与市场需求展望报告
  2. 全球及中国电子式儿科呼吸机行业发展现状与市场销量调研报告2022版
  3. java类编译_java类编译过程
  4. 作业三——原型化系统——外卖app
  5. 配置java环境变量
  6. PHP 底层的运行机制与原理 --转
  7. [转载]Oracle 游标使用全解
  8. SSM整合框架实现ajax校验
  9. Django之Cookie
  10. 转:各种专题图实现的C#源代码