d动态数组容量
string str = "0123456789ABCDEF";
char[] chr = str.dup;
assert(str.length == 16);
assert(str.capacity == 0);
import std.math: thus = nextPow2; //.algebraic
assert(chr.capacity == thus(str.length) - 1);
assert(chr.capacity == 31);
动态数组,按2
的指数增长分配,而串不一样?
另外,.ptr
保存最近的第一个
元素地址,对吗?
write("str[0]@", &str[0]);
writeln(" == @", str.ptr);
write("chr[0]@", &chr[0]);
writeln(" == @", chr.ptr);
你已用串字面
初化了str
.GC
不这样为他们分配
内存.它们存储在二进制
文件中,操作系统从磁盘
加载他们到内存
中.所以str.ptr
指向固定大小
静态内存位置
,因此无额外容量.
chr
使用(可改变的)运行时算法
从GC
分配.更具体地说,指向已分配内存块
的起始地址
.
给定T[]
类型的ts
实例,访问
数组本质如下:
ts[0] == *(ts.ptr + 0);
ts[1] == *(ts.ptr + 1);
ts[2] == *(ts.ptr + 2);
由于T的大小
是已知的,因此每次加指针
都会增加N*T.sizeof
字节.如果转换为ubyte
数组,则需要自己处理.同样,&ts[0]==&(*ts.ptr + 0)==ts.ptr==&(*(ts.ptr+0))
.
容量
是,追加
时无需重新分配
的可存储
多少个数组元素
.
为什么串字面
是0?
因为它不从GC
分配,因此没有附加
的容量(请注意,即使串当前
有16
个字符,也会返回0
容量).
为什么垃集
分配的数组是31
?这是实现细节:
GC
按2的指数(大部分
)分配,最小块为16
字节,下个大小为32
字节.
为了记住用了哪个
块,要分配空间
来记录它.对16
字节的块,需要1个字节.因而31
,还有1
字节用于记录.
串是,长度加指针
而已.str.ptr
是串第一个
元素的指针.没有"最近
的第一个
元素"的概念.
import std.range;
import std.stdio;
/* 切换数组
alias chr = char*;
auto data = [' '];/*/
alias chr = immutable(char*);
auto data = " ";//*/
void main()
{
chr[] ptrs;
data.fill(3, ptrs);
writeln;
foreach(ref ptr; ptrs)
{
" 0x".write(ptr);
}
} /* 打印:
0: 0 1: 15 2: 31 3: 47
0x55B07E227020 0x7F2391F9F000 0x7F2391FA0000 0x7F2391FA1000
//*/
void fill(R)(ref R mostRecent, int limit, ref chr[] ptrs)
{
auto ptr = mostRecent.ptr;
size_t capacity, depth;
while (depth <= limit)
{
mostRecent ~= ElementType!R.init;
if(ptr != mostRecent.ptr)
{
ptrs ~= ptr;
depth.writef!"%2s: %11s"(capacity);
depth++;
}
if (mostRecent.capacity != capacity)
{
ptr = mostRecent.ptr;
capacity = mostRecent.capacity;
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现