dip25,中与引用.

原地址
参考地址
作者:W.B,AA.
大意:d提供了许多系统级编码的功能,如无限制指针,整数和指针转换@系统属性.但,定义这些危险操作时,还要考虑经济性.本dip能够保证引用不指向损坏对象.

总之

接收并想返回引用的函数,必须用注解.模板/λ可以推导出,但其他声明必须显式注解.如:

@安全:
引用 整 函数(引用 整 a){中 a;}//错误
引用 整 滚(中 引用 整 a){中 a;}//好
引用 T 匈牙利(T)(引用 T a){中 a;}//好,模板用推导

描述:
当前d避免悬挂指针有些规定:

引用 整 函数(整 x){
  中 x;//错误:转义引用到本地变量x
}

引用 整 滚(){
  整 x;
  中 x;//错误:转义引用到本地变量x
}

构 S{
    整 x;
}

引用 整 匈牙利(){
  S s;
  中 s.x;//见
}

引用 整 i未(){
  整 a[42];
  中 a[5];//见
}

然而,是很浅的.以下代码编译并允许通过失效栈位置读写,而绕开了域和生命期规则.

引用 整 身份(引用 整 x){
  中 x;//通过空函数
}

引用 整 函数(整 x){
  中 身份(x);//转义形参地址
}

引用 整 滚(){
  整 x;
  中 身份(x);//转义本地地址
}

构 S{
    整 x;
    引用 整 取(){中 x;}
}

引用 整 匈牙利(S x){
  中 x.取;//转义形参部分地址
}

引用 整 i未(){
  S s;
  中 s.取;//转义本地部分地址
}
引用 整 j未(){
  中 S().取;//最差竞争者:转义右值部分地址
}

这些例子中的转义模式是很明显的.不用递归,且可自动找到.但,编译器不能看到身份/S.取()的实体,我们需要根据函数签名来得到足够进行安全分析的信息.
dip允许按引用下传对象至函数,并从函数中用引用返回.并确保引用的安全(不指向已析构对象).

加中为函数属性

主要问题是检查返回T引用且按引用接收的一些参数的函数.已经直接解决了返回本地/部分的.只剩下返回按引用传递的参数的引用T,即参数/返回都是同样的引用.
关键是区分合法与非法.一种太保守的是禁止返回引用参数,这禁止了身份.因而,按引用访问容器元素,就很难或不可能正确检查类型.
确定性析构(如,引用计数)的堆分配结构必须为所有访问插入成员副本.
dip添加延长参数生命期至函数返回值.即,只有标记了的参数,才允许返回参数(或部分).身份这样写:

@安全 引用 整 错误身份(引用 整 x){
    中 x;//错误!不能中引用,请用"中 引用"
}
@安全 引用 整 身份(中 引用 整 x){
    中 x;//好
}

仅通过看签名,引用 整 身份(中 引用 整 x),编译器假定身份的结果<=x生命期,并相应检查类型.给定上个身份定义,则:

@安全 引用 整 函数(中 引用 整 x){
    整 a;
    中 a;//错误每当前语言规则
    静 整 b;
    中 b;//好每当前语言规则
    中 身份(a);//错误,可能转义本地地址
    中 x;//好,传播x的生命期到输出
    中 身份(x);//好,通过身份传播x的生命期到输出
    中 身份(身份(x));//好,两次通过身份传播x的生命期到输出
}

@安全 引用 整 滚(引用 整 输入){
    静 整[42]数据;
    中 数据[输入];//工作,可总是中@静活数据
}

@安全 构 S{
    私 整 x;
    引用 整 取()中{中 x;}//应工作,见下节
}

与动交互

动 引用上是非法的.对泛型/λ函数,作为纯,一般不要求用.

动 引用 T 身份(动 引用 T x){
    中 x;//正确,对中不需要
}

结果类型对比参数

考虑:

@安全 引用 整 函数(中 引用 浮 x);

dip忽略类型,如参数为中 引用,则可转义为结果.也有可能函数作者想限制输出的生命期.
多参数,则假定为参数中的最短生命期.
成员函数,其生命期不能超过.

@安全 构 S{
    静 整 a;
    整 b;
    引用 整 函数(){中 a;}//好,调用者假定无穷生命期
    引用 整 滚(){中 b;}//错误!不能中直接成员
    引用 整 匈牙利()中{中 b;}//好,结果是本内域
}

@安全,最开始本dip仅适用@安全,来避免破坏.

@安全   引用 整 函数(引用 整 x)      {中 x;}//错误
@安全   引用 整 滚(中 引用 整 x){中 x;}//好
@系统 引用 整 匈牙利(引用 整 x)      {中 x;}//现在好,@系统代码.
@系统 引用 整 j未(中 引用 整 x){中 x;}//最佳,对中值的生命期提供更多提示到编译器

完.

posted @   zjh6  阅读(10)  评论(0编辑  收藏  举报  
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示