• englefly
    2020-12-30
    老师,有个问题没有理解 增加了 c 的作用域或主动调用mem::drop(c),会将堆上存储“cccc” 的内存释放(我们假设这个指正地址是0x1234),但这个过程为什么会修改到 d 包含的指针呢? 按照我的理解,d在栈上包含的三个域 地址指针、长度、capacity 都不会因为 drop(c) 而改变,所以我们调用d.push_str()的时候还是应该在原来指针 0x1234 加上 size 找到字符串末尾的地址,然后添加一个 ’c‘。 因此最后打印d,还是应该5个字符,最后一个字符是c。 不知道我的理解怎么错的
    共 4 条评论
    3
  • 豆沙饼
    2021-09-06
    事例三真没有看懂, 老师能说得清晰一点吗, 带个图什么的, 听起来觉得讲得很随意啊
    共 2 条评论
    2
  • 万正宇
    2022-04-27
    unsafe { *(&b *const as B *const as A) }
    
    
  • Geek_7c4953
    2021-06-11
    “=”表示按位复制,左边表示目标位置,目标位置是栈就复制到栈,是堆就复制到堆。
    
    
  • Geek_7c4953
    2021-06-11
    这里的Some(a)是个有趣的问题。 rust的enum是一个tagged union,就是说他会有一个tag值表示他是union中的哪个类型。 当这个enum中所有的位都被占中时,tag就是一个额外的整数。 而当这个enum中,有某个类型有多余的位可以用的时候,tag就是这些多余的位。 在Option<A>中,A的c: bool占用一个字节,但实际的值域只有0和1 ,那么enum就会根据c这个字节的值作为tag来区分union。当c是0或1时,它就是Some(A)。当c是2的时候,它就是None了。
    共 1 条评论
    