Jiang,Sheng(蒋晟)

在VC.Net中使用默认设置/clr编译时,一个托管函数会产生两个入口点,一个是托管的,供托管代码调用,另外一个是非托管的,供非托管代码调用。但是函数地址,特别是虚函数指针只能有一个值,所以需要有一个默认的入口。非托管入口点可能是所有调用的默认入口(在 Visual Studio .NET2003 中,编译器总是会选择非托管入口,但是在Visual Studio 2005中,如果参数或者返回值中包含托管类型,那么编译器会选择托管入口),而另外一个只是使用托管C++中的互操作功能对默认入口的调用。在一个托管函数被另一个托管函数调用的时候,这可能会造成不必要的托管/非托管上下文切换和参数/返回值的复制。如果函数不会被非托管代码使用指针调用,那么可以在声明函数时用VC2005新增的__clrcall修饰符阻止编译器生成两个入口。现在用简单的冒泡排序算法来比较一下使用__clrcall之后的性能改善程度。
using namespace System;
#define ARRAY_SIZE 1000
struct bubbleBase
{
int value;
};
class bubble1:public bubbleBase
{
public:
virtual int getvalue(){return value;}
virtual void setvalue(int newvalue){value=newvalue;}
};
class bubble2:public bubbleBase
{
public:
virtual int __clrcall getvalue(){return value;}
virtual void __clrcall setvalue(int newvalue){value=newvalue;}
};
template
void bubbleSort(int length)
{
TimeSpan ts;
T* array1=new T[ARRAY_SIZE];
for (int i=0;i{
array1[i].setvalue(ARRAY_SIZE-i-1);
}
Int64 ticks=DateTime::Now.Ticks;
int i, j,temp, test;
for(i = length - 1; i > 0; i--)
{
test=0;
for(j = 0; j < i; j++)
{
if(array1[j].getvalue() > array1[j+1].getvalue())
{
temp = array1[j].getvalue();
array1[j].setvalue(array1[j+1].getvalue());
array1[j+1] .setvalue(temp);
test=1;
}
}
if(test==0) break;
}
ts=TimeSpan::FromTicks(DateTime::Now.Ticks-ticks);
Console::WriteLine("BubbleSort {0} Items: {1} Ticks",
ARRAY_SIZE,
ts.Ticks );
delete array1;
}
int main(array ^args)
{
bubbleSort(ARRAY_SIZE);
bubbleSort(ARRAY_SIZE);
return 0;
}
运行结果是BubbleSort 1000 Items: 3281250 TicksBubbleSort 1000 Items: 312500 Ticks可以看到,__clrcall会大大加快在托管代码中调用托管函数的速度。
顺便说一下,在随VC8.0发布的STL中增加了很多安全特性,但是这也会造成程序的运行速度减慢。如果你确认程序不会有缓冲区溢出或者内存越界访问的问题,那么可以把_SECURE_SCL定义成0来关掉这个特性。

托管C++中函数调用的双重转换(Double Thunking)相关推荐

  1. c语言中浮点数和整数转换_C中的数据类型-整数,浮点数和空隙说明

    c语言中浮点数和整数转换 C中的数据类型 (Data Types in C) There are several different ways to store data in C, and they ...

  2. C语言中的数据类型及其转换详解

    http://www.cnblogs.com/jpcflyer/archive/2012/02/16/2353447.html 1. C语言中的数据类型 C语言中的类型按其组成可以分为简单类型和构造类 ...

  3. Java开发中数据类型之间的转换

    1).简单类型数据间的转换,有两种方式:自动转换和强迫转换,通常产生在表达式中或方法的参数传递时. 自动转换 具体地讲,当1个较"小"数据与1个较"大"的数据1 ...

  4. ssis 列转换_SSIS中的术语提取转换

    ssis 列转换 This article explores the Term extraction transformation in SSIS and its usage scenario. 本文 ...

  5. ssis 列转换_SSIS包中的行采样转换和百分比采样转换

    ssis 列转换 This article explores Row Sampling Transformations in SSIS and Percentage Sampling Transfor ...

  6. ssis 转换中文字符乱码_SSIS软件包中的字符映射转换

    ssis 转换中文字符乱码 This article explores the Character Map Transformation in SSIS package with available ...

  7. ROS中欧拉角和四元数转换

    ROS中欧拉角和四元数转换 欧拉角转四元数 四元数转欧拉角 欧拉角转四元数 #include <ros/ros.h> #include <tf/tf.h>int main(in ...

  8. C语言中的大小端转换与高低位颠倒

    在说大小端高低位之前,肯定要说明数据在计算机内是如何存储的.在计算机中,我们将数据分割成了一个一个的字节(byte),而每个字节又有8位(bit). 一个字节,可以声明为unsigned char型数 ...

  9. 【Eigen和tf中位姿表达方式转换】【tf::StampedTransform】【Eigen::Matrix4f】

    [tf的使用][Eigen和tf中位姿表达方式转换][tf::StampedTransform][Eigen::Matrix4f] 0 前言 1 tf::StampedTransform<--& ...

最新文章

  1. CEMAPI实战攻略(四)——发送短消息
  2. Spring 4.2中由注释驱动的事件侦听器
  3. [react] 经常用React,你知道React的核心思想是什么吗?
  4. 通过 sync.Once 学习到 Go 的内存模型
  5. matlab 追赶法
  6. java io装饰类,Java IO 装饰类新说
  7. oracle rac 在完成安装错误。
  8. MyEclipse + Maven开发springMVC的WEB工程的详细配置过程
  9. gitLab下载安装和使用教程
  10. 5w1h,人机料法环
  11. 心得体会标题大全_关于取标题,我的一些心得体会
  12. 格创东智获《互联网周刊》2020工业互联网平台TOP12 解决方案提供商TOP16
  13. 从COD着陆页设计优化谈起
  14. java 字符串4%3e=3,gson 生成的json字符串带\u003c,\u003d,\u003e的解决方案
  15. stata-如何快速合并多个文件夹下的数据文件
  16. FPGA概念理解之:ZYNQ、PS、PL、APU、ARM、SOC、URAT、GPIO...
  17. 官宣!2022汇佳学校毕业生捷报汇总
  18. API-String类、基本数据类型对象包装类
  19. uva 10099 The Tourist Guide(单源最短路/spfa/dijkstra)
  20. Pixel 手机上基于多曝光序列的 HDR+ 拍摄功能

热门文章

  1. java萍方字体_html苹方字体 - osc_wv1mxwu2的个人空间 - OSCHINA - 中文开源技术交流社区...
  2. 问鼎CodeXGLUE榜单,华为云UniXcoder-VESO-v1算法取得突破
  3. 文件和目录的常用命令
  4. js干货-Bom,Dom事件及各种案例
  5. 驱动程序调试常用方法
  6. 使用 Amazon EMR 构建您的数据分析平台
  7. 谷歌Analytics(分析)跳出率 - 到底什么意思
  8. 有了热和光,家才是暖居
  9. 辐射能量降低裂变效应工程第二期
  10. 研究生学位论文质量快速下滑,写作水平非常低劣,学生任性急躁,工匠精神缺失,论文看不出热爱和用心...