d允许隐式切片静态数组

原文

struct S {
    int[] data;
    this(int[] _data) { data = _data; }
}
S makeS() {
    int[5] data = [ 1, 2, 3, 4, 5 ];
    return S(data);
}
void func(S s) {
    import std.stdio;
    writeln("s.data = ", s.data);
}
void main() {
    S s = makeS();
    func(s);
}

期望输出:

s.data = [1, 2, 3, 4, 5]

实际输出:

s.data = [-580467872, 32764, 1617267003, 21973, 5]

如果使用@safe注解函数,会得到:
test.d(9):弃用:引用赋值给调用this的非域参数的数据局部变量
编译器自动切片静态数组,是非常好的,因为键入更少.应由@safescope来检测逃逸过期栈帧指针.不过,在系统代码中,没问题.

我不同意,编译器隐式切片静态数组,和C++中的隐式构造有同样的问题:引起意外.
不应逃逸过期栈帧指针,至少,不应隐式的.如果想显式地逃逸引用局部静态数组,应强制显式切片,而不是让编译器悄悄插入它.

意思是,有时,确实值得隐式切片静态数组.如,标准库可实现带动态数组函数,用户可方便地使用静态数组来调用它们.这一般不会使内存崩溃,对无经验用户可有更流畅的体验.
此外,计划默认设置DIP1000@safe,因此,默认自动发现自动切片可能逃逸到过期栈帧指针的动态数组.
反对该行为,只会给经验不足用户带来烦恼,而没有明显好处.

posted @   zjh6  阅读(9)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示