加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

D 说话的数组和字符串

发布时间:2018-04-14 06:21:45 所属栏目:编程 来源:云风的 BLOG
导读:这个国庆假期,我读完了《D措施计划说话》 一书。内里读到了许多风趣的对象,挑一点写出来和各人分享一下。 字符串,数组和关联数组(hash 表)是最重要的三种数据布局,我们险些可以操作它们模仿出任何更伟大的布局。Lua 就是这么干的,只不外 Lua 把数组

这个国庆假期,我读完了《D措施计划说话》 一书。内里读到了许多风趣的对象,挑一点写出来和各人分享一下。

字符串,数组和关联数组(hash 表)是最重要的三种数据布局,我们险些可以操作它们模仿出任何更伟大的布局。Lua 就是这么干的,只不外 Lua 把数组和关联数组归并成一个 table 范例了。D 在说话层面临这三种数据布局支持的很好,观念界说很是清楚。这一篇只谈数组和字符串,不涉及 hash 表的部门。

数组可以当作是存放统一范例数据的持续内存。

在 C 说话中,数组和指针固然是差异的范例,但编译器天生的代码却是沟通的,可以说实质上,数组即指针。但将数组隐含有长度信息,即内存的范畴。有些数组是牢靠巨细的,在编译器就知道其范畴;有些数组必要动态扩展巨细,其范畴是运行期确定,并可以改变的。无论怎样,对数组的随机遇见,缺乏界线搜查的代码都潜匿着风险。

D 说话是一门祈望有高安详性的同时又重视运行机能的说话。它在均衡这个题目上的办理方案很风趣。措施员可以指定一段代码是安详的,照旧体系级的,照旧是接口安详的。按照差异的标注来插入界线搜查代码。在 debug 版中,纵然是体系级代码,也会插入相同 assert 的左券搜查。

因为 D 说话以 GC 为内存打点焦点(且要求全部数据都是位置无关,可移动的),以是打点数组切片 Slice 就变得很简朴。差异的Slice 引用统一块内存,不消担忧数据生命期题目。扩展数组也可以按照必要从头分派内存,或是在原地扩展。

提到数组扩展,不得不谈一下 D 说话中布局的 postblit 。D 说话中,全部的 class 都是引用语义的,而 struct 是值语义的。C++ 中花了许多年想办理的一本机能题目就是源于 vector 扩展时,数据怎样从旧的位置移动新位置的题目。在 stl 的 sgi 实现中,为 POD 布局增进的特化模板来进步复制服从;在 C++11 中又从说话层面增进了右值引用来实现移动语义,来办理重复析构结构工具带来的机能挥霍。

而 D 说话中没有那些艰涩的移动结构,拷贝结构观念;它只有 postblit 。也就是数据都应该默认按位复制(blit),然后在 blit 后,再用 postblit 要领去修改新的副本。这种不动源工具,而只在副本上修改的移动钩子技能观念更简朴清楚。并且编译器可以自行推导什么时辰挪用 postblit 才是须要的。这个技能不只仅用来办理数组的扩展题目,也可以很好的搞定 C++ 中返回值优化题目。

对付牢靠巨细的数组,D (2.0) 是按值范例处理赏罚的(动态数组则是引用范例),差异长度的数组是差异的范例,但它们都可以隐式转换(映射)成动态数组。较量短的牢靠命组做值转达的时辰更利便高效,也切合其余基本范例的特性。长数组可以通过 ref 修饰按引用转达。

D 说话的风趣之处在于 string 着实就是一个不行变的动态数组,string 着实是 immutable(char) [] 的别名。它也同时支持 wstring 和 dstring 。而其余很多类 C 的说话,好比 C# java go C++ 等,string 则是一个独立的范例。

但 D 说话也为 immutable(char) [] 做了些出格的对象。起首编译器支持了很强盛的字符串自面量的描写语法。不仅是 C 说话已经支持的那些,还支持 2 进制暗示 (0b10111 这样的),可读的 16 进制暗示 ( x"7f 00 01" 这样的 ) , 所见即所得气魄沤背通打消转义)的字符串等等。

D 说话把 Unicode 作为其尺度字符集,且默认选择 UTF-8/UTF-16/UTF-32 做默认编码。一个较量怪异的处所是 foreach 对 string 的迭代:

string str = "中文"; foreach (c; str) { ... }

假如这样处理赏罚中笔墨符串,这里中文被编码成 UTF-8 ,但 str 是 string 范例(而不是 wstring 或 dstring),foreach 会自动推导 c 这个变量的范例为 char ,然后按字节而不是按字逐个取出字符。

可一旦你这样写:

string str = "中文"; foreach (dchar c; str) { ... }

指定了 c 的范例为 dchar ,那么 foreach 就可以正确的按 UTF-8 法则支解字符,把中文按字取出来了。

因为 string 本质上是 immutable(char) [] ,一个引用范例。以是转达 string 很是便宜。immutable 变量还可以自由的跨线程共享。GC 可以担保 string 的生命期被正确的打点。

数组的 == 操纵被改写过,以是可以正确的按值较量。字符串也是数组,以是 == 操纵也能按字面意思正确运行。在 D 说话中,数组/字符串也可以用于 switch 语句,这很是的利便。假如然要较量两个字符串是否是统一个变量,D 说话提供了 is 较量操纵来较量是否引用着统一个工具,而不像 C# 那样,你必要挪用库函数 Object.ReferenceEquals(Object obj1, Object obj2) 。

ps:尽量数组在 D 说话中足够高效,但依然提供了裸用指针的要领。只必要用 .ptr 取出数组的指针即可。但说话不再提供任何的安详性保障了。这并不保举,并且你可以拟定用 D 说话的一个子集 SafeD 做开拓,这样大部门指针操纵都被编译器榨取了。

文章来自云风的BLOG:http://blog.codingnow.com/2013/10/dlang_string.html

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读