新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论高级C/C++编程、代码重构(Refactoring)、极限编程(XP)、泛型编程等话题
    [返回] 计算机科学论坛计算机技术与应用『 C/C++编程思想 』 → C++/CLI的“值类型的强类型装箱实例”[转帖] 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 2939 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: C++/CLI的“值类型的强类型装箱实例”[转帖] 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     enorm 帅哥哟,离线,有人找我吗?
      
      
      威望:4
      头衔:头衔
      等级:大三暑假(参加全国数模竞赛拿了一等奖)(版主)
      文章:144
      积分:854
      门派:Lilybbs.net
      注册:2005/12/1

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给enorm发送一个短消息 把enorm加入好友 查看enorm的个人资料 搜索enorm在『 C/C++编程思想 』的所有贴子 引用回复这个贴子 回复这个贴子 查看enorm的博客楼主
    发贴心情 C++/CLI的“值类型的强类型装箱实例”[转帖]

    近来接到几个朋友问Visual C++ 2005 (C++/CLI) Webcast中讲的“值类型的强类型装箱实例”是什么?

    讲座比较匆忙,因此对这个技术点只是点了一下,没有详细展开。这里借blog把它展开说一下。


    首先来看下面的C#代码:

    using System;
    using System.Collections;

    struct MyClass
    {
        public    int data;
                   
    }


    class Test
    {
        public static void Main()
        {
            MyClass myClass1 = new MyClass();
            MyClass myClass2=new MyClass();

            ArrayList list=new ArrayList();

            list.Add(myClass1);
            list.Add(myClass2);

            Print(list);

            for(int i=0;i<list.Count;i++)
            {
                MyClass temp=(MyClass)list[i];
                temp.data=i+1;

                list[i]=temp;// 注意这句话

            }

            Print(list);

        }

        public static void Print(ArrayList list)
        {
            for(int i=0;i<list.Count;i++)
            {
                MyClass temp=(MyClass)list[i];
                Console.WriteLine(temp.data);

            }
        }
           
    }
    其中list[i]=temp这句话很重要,否则无法实施改变,因为temp是一个“和list中hold的boxed的值实例无关的”stack上的实例。

    但是如果使用C++/CLI,我们就可以这么做:

    using namespace System;
    using namespace System::Collections;

    value class MyClass {
    public:
       int data;
    };

    void Print(ArrayList^ list);

    int main() {
       MyClass^ hMyClass1 = gcnew MyClass;
       MyClass^ hMyClass2 = gcnew MyClass;

       ArrayList^ list=gcnew ArrayList();

       list->Add(hMyClass1);
       list->Add(hMyClass2);

       Print(list);

        for(int i=0;i<list->Count;i++)
        {
            MyClass^ temp=(MyClass^)list[i];
            temp->data=i+1;  // 注意这里无需再有list[i]=temp这句话,因为temp引用的就是“list中hold的boxed的值实例”
        }

        Print(list);

    }

    void Print(ArrayList^ list)
    {
        for(int i=0;i<list->Count;i++)
        {
            MyClass^ temp=(MyClass^)list[i];
            Console::WriteLine(temp->data);
        }
    }

    其实在C#中,我们使用MyClass temp=(MyClass)list[i]; 中间就发生了一个unbox和一个copy动作。

    而在C++/CLI中,我们使用MyClass^ temp=(MyClass^)list[i]; 中间只发生了unbox,而没有发生copy动作——注意只发生unbox,而数据还位于managed heap中,但是类型却是MyClass^,这样我们就可以直接获取MyClass的data成员——这就是我所说的“值类型的强类型装箱实例”。

    这在C#中是不能做到的,只能获得类型为Object的一个“弱类型”——有一种办法是采用interface来间接实现,因为interface是一个引用类型。

    “值类型的强类型装箱实例”当然不仅仅意味着“少写代码”,实际上它带来很好的性能提升——因为unbox代价很小,与copy动作是分离的。不像box,它是代价比较高的操作,因为本身包含copy动作。


    其实C++/CLI对类型的强大描述能力不仅仅体现在这一个地方,还有很多,比如interior_ptr,这将是我今后将要剖析C++/CLI的一个重点, 也是我去年撰写“漫谈C++/CLI中的几种指针和引用(1)”(http://blog.dreambrook.com/jzli/archive/2004/11/20/352.aspx)系列的规划——可惜后来由于太忙,没有集中的时间展开。展开讨论它要相当大的篇幅,因为它牵扯到对托管对象模型的深入剖析。下面我会随着自己对Shared Source CLI (Rotor)源代码的剖析,来展开这一系列的blog。


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    天亮了

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/12/21 13:43:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 C/C++编程思想 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/11/26 7:09:25

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    46.875ms