standford cs110l lec3

lecture note

  • rust的struct中存在指向其他buffer的指针的时候,如果有人要去解引用一个指针,并且这个指针指向的buffer已经被释放了,对于ownership的分析而言,就会出现问题
  • 函数传递ownership还是传递reference,
    • 编译器在传递ownership的时候,编译器会代表你在编译时执行ownership检查,但是rust生成的汇编代码与c语言的没有差别
    • 当你传递一块内存的ownership时,实际上传递的是一个pointer,但是在这个值的lifetime的末尾会插入一个free函数
    • 当你传递一个reference,你也是传递一个指针,编译器会自动的帮助解引用
    • 当你显示的拷贝时,才会发生内存的拷贝
  • 为什么这里的s是immutable borrow?这里的宏函数printlin!是一个过程宏,那么其生成的函数,需要传递不可变的引用rust中的引用&是会自动解引用的,对于修改之后,s1不会被在使用了,所有ownsership回到s,对于函数参数什么时候用&,什么时候传递onwership,这个由函数语义决定
  • 对于某个变量会是NULL值,那么程序员需要处理可能出现的相关错误,Option可以处理这个值Option是一种enum,可以使用match模式匹配,unwrap_or()等函数来处理
  • c语言处理error的方式非常朴素,在发生错误的时候,程序会将全局变量errno设置一个整数,那么调用方看到错误的时候,会去检查errno,以此来检查发生了什么错误
  • 内核的返回值错误?看到非零值,就认为出错了
  • cpp用exception处理错误,但是异常由于throw,可能会出现使用一个函数,而在其他关系不大的helper函数中抛出异常以及exception容易在代码量逐渐变大的项目中,难以处理
  • rust中处理错误的哲学,是遇到不可恢复的错误直接panic,完全不捕捉处理
  • 对于可以恢复的错误,应该返回Result枚举类型,unwrap和expect在展开Result时,遇到Err变体,直接panic
posted @ 2022-06-11 12:52  抿了抿嘴丶  阅读(47)  评论(0编辑  收藏  举报