背景:cpp老手,rust看过两天文档。现在观望中。我实在没找到rust适合的场所。也没有什么必须的平台逼得我要用rust。能用rust写的东西,我用cpp,csharp,java都能写。所以,与其去跟rust的编译器斗,还不如去跟cpp的template斗。rust的内存安全在我看来,是个伪命题。cpp我好多年没用出重大内存bug了,真在乎非常高的内存安全,我选用csharp。除非有啥大的平台,比如苹果那样的,逼我用rust,我想,我恐怕不会主动去用了。2020/02/24更新如下:一个周末没关注,居然这么多人留言,大部分都是不相信cpp能写得没重大内存BUG的。一、首先,当然,也不是倚老卖老,可我真从1997年开始学C/C++,并且一直保持对C++最新进度的关注,并积极引入C++最新用法到项目里。所以,从经验,到应用C++上,都比大部分更不容易出错。二、C++的重大内存BUG,不是内存泄漏。最主要的是野指针,然后是未初始化指针,其次越界。野指针/未初始化指针,在C++11后,严格使用shared/unique ptr,是很难出现的。其次,使用vector替代裸指针,array替代原生数组,借助vector/array自带的越界检查,很多越界在开发期间就发现了。三、在全面使用智能指针的前提下,内存泄漏还是可能发生的。要么规模很小,尚不足引发重大问题,要么规模很大,借助第三方的工具和代码,其实很好定位。感谢现在生活在动辄几个G,加上64位系统的超大的地址空间,内存泄漏可能存在,但从来没给我所在的项目组造成过任何麻烦。有人可能会提长期运行如何如何,不好意思,我主要是写游戏服务器,不存在需要连续运行多长时间的。只要能跑两周不出问题就OK。四、全面开启静态代码分析,且警告当作错误处理,禁止全范围的禁止某个警告;局部屏蔽任何警告均需要报告讨论。一些低级错误都没法通过编译期。五、因为仅一年多写C#去了。所以,就拿倒回去三年的项目为例,整个服务器上线后,迄今只有一起内存越界导致的崩溃,代码还是同事写的。六、直接使用C字符串的机会并不多。现在输入数据基本都是标准的json/xml/ini等,都采用一些现成的开源库,输出基本都是{fmt}库。所以,有人提到因为不安全的函数导致的问题,就更少了。而这个问题,更多是容不容易被黑的问题,还不仅仅止于程序BUG的问题。反而最容易忽视的是一些老的具有线程安全隐患的函数,不过这些函数MSVC均默认警告。

距第一次翻开 C Primer Plus 已经有六七年了, 书里讲了什么都已经记不太清了. 然而里面有一句话我印象特别深刻, 直到今天都记得特别清楚:自由的代价是永远的警惕!Rust 是否限制了程序员的能力发挥? 是, 限制了. 灵活, 速度和安全, 一个语言最多同时拥有其中的两样. Rust 选择了速度和安全, 只能牺牲灵活了.因为:程序员水平不一, 让他们随意发挥不知道能写出什么代码来. 你可能觉得这种写法没有问题, 但是编译器: 我不要你觉得, 我要我觉得.迭代 vector 的同时修改 vector 导致迭代器失效的坑, 不知道有多少 C++ 程序员踩过? 然而这种代码在 Rust 里根本通过不了编译. 还有什么 use after free, double free, dangling pointer...blabla 之类的坑在 safe Rust 里你想踩都没有机会踩. 因为(臭名昭著的)(划掉) Borrow Checker 限制了你要么拥有一个可变引用, 要么拥有若干个不可变引用; 所有权机制防止你在不知不觉中创建拷贝以及使用已经失效了变量; 生命周期检查保证了引用的有效性...题主好奇的话, 我建议直接阅读 TRPL: Rust 程序设计语言 简体中文版. 听别人说不如直接自己上手学.2. Rust 目前表达能力还不足, 有时确实会出现"这个地方真的没有问题然而编译器就是觉得有问题"的情况.比如(臭名昭著的)(再次划掉) Borrow Checker, 早期非常蠢. 现在有了 NLL 以后情况好很多了, 然而还是会碰到不能覆盖的情况: 下面这段明明没啥问题的代码 (来自 Polonius - Nicholas Matsakis) 就无法通过检查.fn get_or_insert(

map: &mut HashMap<u32, String>,

) -> &String {

match map.get(&22) {
    Some(v) => v,
    None => {
        map.insert(22, String::from("hi"));
        &map[&22]
    }
}

}
又比如经典的"双指针修改链表倒数第 n 个节点"问题: 双指针遍历, 那必然是要两个不可变引用才行. 然而遍历完了我需要使用慢指针来修改节点, 那慢指针得是可变引用才行——矛盾产生了, 你在目前的 safe Rust 中没法写出这样的代码来.怎么办呢? 只能上 unsafe 了......总而言之, Rust 确实限制了程序员的能力, 然而大部分限制都是合理的. 对与我这种一方面想要极致速度, 一方面又觉得自己水平太差, 做不到"注意一点"就能避开 C/C++ 中的坑的平庸程序员, Rust 简直太棒了