怎么更好的设计C 栈对象
创始人
2024-06-21 18:41:05
0

C++中的栈是一种只允许在同一端进行插入和删除操作的特殊线性表,进行插入和删除操作的一端称为栈顶,而另一端为栈底,知道了什么是栈了,那么下文给大家讲解什么是C++中的C++栈对象。

这的确不错,相对而言,这个比C#中的using 关键字(dispose模式),以及Java中的hard-coded的dispose方法都要好许多。这个特性是由C++栈对象(局部对象)来提供的,局部对象本身没错,RAII也是局部对象应有之义。

但问题在于C++栈对象的可用性由于许多原因会大打折扣,使用起来已经远远不如ISO-C++中那样流畅。下面列出了损伤其可用性的几大硬伤:

  1. String s("abc");  
  2. ArrayList list;  
  3. list.Add(%s);  
  4.  
  5. 实在很不好,还是使用追踪引用比较好:  
  6.  
  7. String^ s="abc";  
  8. ArrayList^ list=gcnew ArrayList();  
  9. list->Add(s); 

只要类型是ref class,C++/CLI中的对象就仍位于托管堆中。仍然使用newobj IL指令来分配。如果R没有定义析构器(~R)(注意:C++/CLI中的析构器和C#中的析构器完全两回事),那么下面两行代码实际上将生成完全一样的IL代码:

好像记得Herb Sutter曾经说过他们将来可能会在真正的方法中分配r ——说实话恐怕只有C++背景的人敢这么“胡思乱想”:) 他们现在只是想在语法层面让程序员"感觉"就像r是从中分配的一样,当然为了对称和语义的***,有时候还需要在r上应用%——虽然背后仍是什么也没做。

这一点非常令人烦恼,几乎让人“望C++栈对象而却步”。更糟糕的是BCL中的所有类型都没有提供拷贝构造函数和拷贝赋值操作符——因为恐怕只有C++/CLI会用到他们。话说回来,即使C++/CLI会自动产生拷贝构造函数和拷贝赋值操作符,那么继承自BCL的类型还是会很麻烦。#t#

编译出来有一个modopt元数据,所以可以被其他语言调用,但是如果被其他语言调用,比如C#,那么其他语言将是以传值的方式传递引用,而C++/CLI将是传递对象拷贝(要调用拷贝构造器),所以语义混乱,完全不可以这样做。

#1和#5对对象的可用性影响不算大,毕竟从语义层面来理解,还是行得通的。但是,#2、#3、#4的影响就很大。#3和#4使得我们必须放弃使用C++栈对象来进行互操作。而#2会让编写C++/CLI代码非常的不方便——除非你以后不想使用C++栈对象

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...