d共享左值
shared TT[] a;
T processArray(T)(ref T[] p){/*...*/}
//函数在参数上调用`.保留`.意思是`void`为函数`返回类型`
a.processArray;
//不能从`!()(shared(T[]))`推导.
即使更改函数为仅接受
共享参数,.reserve
也不支持共享
,因此如果不更改
类型或使用__gshared
,则无法使用该函数.
除了使用
指针和强制(用processArray(*(cast(Unqual!TT*)&a))
转换,不理想)之外,有没有更好的方法来不转换为右值的转换左值
类型?(因为编译失败
,直接强制转换
似乎会创建右值
.)
谢谢
.reserve
无法正确支持shared
,因为在整个程序
中,它不知道如何正确同步
切片及其内容.
一般,丢弃shared
让编译器停止
抱怨,完全违背shared
的目的,与__gshared
一样不安全.
相反,必须自己,如使用core.sync.mutex
来同步
.只有正确同步,才可丢弃shared
.这是shared
的目的,且与__gshared
的唯一区别:转换时,记住要同步
.
一般,应该同步整个shared
代码保护区域,同步单个操作(就像单独同步.reserve)
一般是错误的,或更确切地说,是不够
的.
同步
必须保证:当线程写入
数据时,它具有独占
访问权限.但是,只要此时不写入
数据,多线程
同时读取
数据是安全且快速
的.core.sync.rwmutex
可以用来实现该优化.
(可用无锁
算法(请见core.atomic
)或其他更复杂
的方案来设计支持多个同时写入
算法,这很难,有时不必).
最后,如果只需要写入一次
数据,之后只会
读它,则可跳过所有这些混乱和复杂性
,只需从非共享
容器中的单线程
准备数据,然后使用cast(immutable)
(如果只有一个现存引用)或.idup
(否则).不必同步immutable
数据.
*(cast(Unqual!TT*)&a)
,这是重新强制转换左值
的正确方法(前提是生成类型
与源类型兼容).
(因为编译
失败,直接转换
似乎创建了右值
.)
是的,直接转换
应该产生右值
.(虽然,可用自定opCast
义来去掉它.)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现