Rust 遇上 C/C++(二):函数传参
上一期在 Rust 遇上 C/C++(一):数组操作 中,我们了解了 Rust 相比于 C/C++ 在数组操作上提供的安全保证。我相信大家对 Rust 有了初步印象的同时,对这门新生的系统级编程语言产生了浓厚的兴趣。
这一期我们来探讨 Rust 在函数传参上与 C/C++ 的不同,这一期仅讨论基本数据类型。
环境:Cent OS 8(Kernel 4.18.0),gcc 8.3.1,g++ 8.3.1,rustc 1.43.1。
C
在 C 中进行函数参数传递时,我们尝试将一个 double 类型(8 字节浮点型)传递给 int 类型(4 字节整型)。众所周知,浮点型和整型在内存的存储形式截然不同,并且大空间到小空间的拷贝,可能引发数据截断,这对程序来说是非常不友好的行为。
不同环境中,double 和 int 的空间大小可能不同。
编译没有任何错误,程序正常运行。
具体 5.21 是如何截断成 5 的底层实现细节,在这里就不加赘述了。
C++
在 C++ 中使用和 C 中相同的用例, double 类型(8 字节浮点型)传递给 int 类型(4 字节整型)。
由结果可以看出,C++ “传承”C 灵活的特性,赋予了使用者极高的自由度,反正写好的程序可以被计算机执行即可(当然,这是一句玩笑话)。
Rust
在 Rust 中我们稍微改变一下测试用例,将 i32 类型(4 字节整型)传递给 i64 类型(8 字节整型)。这种传递方式相比于针对 C/C++ 的用例来说,应该算是“友好”许多了吧,让我们来看看在这种“友好”的前提下,Rust 呈现给我们的是什么呢?
是的,在这种较为“友好”的情况下,Rust 在编译过程中就报了错误信息。现在,大家是否也感觉到了作为系统级编程语言,Rust 那是相当严格啊!
总结
在 C/C++ 中进行基本类型数据的函数传参时,对类型检查的能力稍弱。
相同情况下,Rust 在编译过程中就进行严格的类型检查,避免了数据截断等不易察觉的错误。
版权声明: 本文为 InfoQ 作者【Coding Fatty】的原创文章。
原文链接:【http://xie.infoq.cn/article/f6a11ffa132cdb4b5191f44c0】。文章转载请联系作者。
评论 (1 条评论)