当前位置: 首页 > news >正文

2607d,原位

原文

原位

D的C++级,无GC数据结构和灵针.

如今写@nogcD一般表示回到C主义,原始指针,手动分配/释放,手动操作的容器.
原位改进了这一空白:你期望C++的容器和灵针<memory>/<vector>/<map>,分配器相关(std.experimental.allocator),分配器在当前的LDC/DMD正确@nogc.

安装

dub add emplaceimportemplace.smartptr:Uniq,Shared,Weak;importemplace.vector:Vector;importemplace.map:Map,OrderedSet;

里面有什么

基于libc++s<memory>(emplace.smartptr)灵针

1,Uniq!(T, Alloc = Mallocator),即"unique_ptr:单一物主,仅移动,加上Rust风格的借取/取(Option::take)/intoInner(box::into_inner).
2,Shared!(T, Alloc = Mallocator)shared_ptr:引用计数,复制增加计数,带弱计数make_shared内联控制块(一次分配).
3,Weak!(T, Alloc = Mallocator)weak_ptr:非物主观察者,锁()/过期,lock() / expired.

容器

1,emplace.vector.Vector!(T, Alloc = Mallocator),是一个动态数组;块put(slice)是个单一的memcpy(不是每个元素的循环).
ShrinkToFit(shrink_to_fit).'Vector!bool'位打包(std::vector<bool>):每个元素一个位,opIndex返回一个可赋值的代理位引用.

2,emplace.deque.Deque!(T, Alloc = Mallocator),是一个双端队列:一个在连续块上的环形缓冲,O(1)两端压/弹,O(1)随机访问.
内存耗尽时释放(在1/4负载时减半容量,空时释放),对长期运行的先进先出(FIFO)来说安全.

3,'emplace.map.map!'(K,V)',一个基于手动操作红黑树的有序映射O(logn)插入/查找/移除,排序迭代,leftBound/rightBound,floor/ceiling+foreachRange,removeRight消耗前缀区间.

4,'emplace.map.orderedSet!T',有序集:无值伴集(联/交集/差分/对称差/子集/超集).

5,'emplace.hashmap.HashMap!'(K,V)',即unordered_map:开放定位哈希表,带后向移位线性探测删除.
6,'emplace.hashmap.HashSet!K'unordered_set.

每个容器都是RAII灵针安全的:把元素移动进位置,然后popBack/clear/~this释放每个元素(它的.free()析构器).
所以是一个Vector!(Uniq!T)Deque!(Shared!T)从不泄漏.每个元素(深度独立复制,Mapstd::map一样深度复制其树)都可精确复制;

仅移动类型的元素(如Uniq)使整个容器仅移动,因此按位复制不能两次释放.都有D区间(opSlice).

分配器

所有参数都用std.experimental.allocator分配器来参数化,默认使用Mallocator.属性是推导的,因此在Mallocator下,都是``@nogc nothrow;
GCAllocator,FreeList,Region,InSituRegion,或你的,不变.

importstd.experimental.allocator.building_blocks.free_list:FreeList;importstd.experimental.allocator.mallocator:Mallocator;//节点池:在`基准测试`中,每次分配比`分配malloc`便宜`~10-16`倍alias Pool=FreeList!(Mallocator,64);

示例

importemplace.smartptr:Uniq,Shared;importemplace.vector:Vector;@nogc nothrow:autobox=Uniq!int.make(42);//拥有一个堆整数,在`ScopeExit`时释放inttaken=box.intoInner();//将值移出(`box::into_inner`)autorc=Shared!string.make("hi");autorc2=rc;//`refcount==2`,最后为0时释放Vector!ubyte buf;buf.put(cast(const(ubyte)[])"hello");//没有每字节循环的一个`memcpy`
http://www.jsqmd.com/news/1216836/

相关文章:

  • Devin AI工程师认证考试倒计时:仅剩27天开放首批企业内推通道(附官方未公开的模拟题库)
  • Linux Shell编程实战:需求驱动的高效脚本开发
  • AM62L CBASS防火墙配置实战:从寄存器手册到功能安全实现
  • HSTracker:macOS炉石传说卡组追踪器终极指南,5分钟成为数据分析大师
  • Java没指针?用对象引用实现单链表,这波操作直接封神
  • 树结构的遍历与平衡调整
  • 卡地亚中国官方售后服务中心|官方地址及24小时客服电话权威信息声明(2026年7月最新) - 卡地亚官方售后中心
  • Android开发环境搭建与核心技能全解析
  • 三步彻底解决机械键盘连击问题:KeyboardChatterBlocker 实用指南
  • 5分钟掌握免费视频下载插件:VideoDownloadHelper完整使用指南
  • 单片机编程软件很简单之keil单片机编程软件编程事项介绍
  • Android手机直连Switch游戏传输终极指南:NS-USBloader移动版完整教程
  • Navicat重置脚本终极指南:Mac版Navicat 16/17无限试用完全免费方案
  • 鸿蒙 ArkTS 实战:Mood Companion Diary 从智能助手到保存闭环完整解析
  • Rust实现猜数游戏:从入门到实践
  • 敏捷开发者如何高效利用博客持续学习
  • 江诗丹顿回收价格查询及靠谱平台实测排行(2026年7月最新) - 江诗丹顿服务中心
  • FPGA数码管动态扫描驱动设计与Verilog实现
  • 从零部署KataGo围棋AI:开源引擎配置、分析与实战指南
  • STM32固件开发实战:从寄存器操作到智能温控系统
  • MSPM03507驱动MPU6050:嵌入式运动检测与姿态解算实战
  • Unity 2D像素游戏动画与碰撞器错位问题:从原理到实战的完整解决方案
  • Google开源生态与核心技术解析
  • MXSDOC在线笔记
  • 使用React Context跨组件传值
  • 日语敬语与语气词翻译技术方案:语言学规则库如何处理特殊称谓
  • Android ViewBinding核心优势与实战技巧
  • 亲身到店探访重庆江诗丹顿官方售后服务中心|完整热线和最新维修地址(2026年7月最新) - 江诗丹顿官方服务中心
  • Zynq SoC架构解析与嵌入式开发实战指南
  • EventBus3.0架构解析与Android组件通信优化