【发布时间】:2020-01-20 01:38:13
【问题描述】:
我正在尝试测量我正在编写的 rust 程序的内存大小。我注意到,当我使用以下命令测量堆大小时:
valgrind --tool=massif --pages-as-heap=yes ./program
并使用 ms_print 进行测量,内存大小非常大(最初约为 16MB)。最终,我将我的 rust 程序简化为一个空的 main 函数:
fn main() {
}
我编译了,仍然有 16MB 作为我的内存大小。我注意到,当我使用不同的机器时,相同的二进制文件的总大小为 4MB。我的一个朋友在他的机器上使用相同的程序尝试了这个,使用相同的 rust/valgrind 版本,大小也为 4MB。
我想这是对可能在堆中使用的内存的某种预分配,但我想不出任何方法来控制它。我什至尝试按照this 指南更改分配器,但没有任何改变。
系统详情:
OS version = Ubuntu 18.04
valgrind version = valgrind-3.13.0
cargo version = cargo 1.39.0-nightly (3f700ec43 2019-08-19)
rustc version = rustc 1.39.0-nightly (e44fdf979 2019-08-21)
ms_print = ms_print-3.13.0
libc version = ldd (Ubuntu GLIBC 2.27-3ubuntu1) 2.27
【问题讨论】:
-
那可能是stdout、stdin和stderr的输出输入。这也可能需要分配 rust 以从命令行解析
argv。也许还有其他的事情。为什么要打扰这种事情?这只是在启动时,并且足够快。 -
@Stargateur 这似乎不是由于 stdin、stdout、stderr 和 argv 造成的,因为同一个程序在不同的计算机上给出不同的输出。我认为这也不太可能消耗 16MB 的内存。至于为什么要麻烦,目标是编写一个消耗很少内存但仍然具有良好性能的程序,即如果目标机器的内存量很小(例如旧手机或Arduino),内存是宝贵的资源不能浪费!因此检查内存使用情况的重要性。我相信下面的回答提供了一个很好的答案!
-
我坚持我的主张,因为 Sébastien 说有 16mo 的页面并不意味着程序真的使用 16mo。请考虑使用no_std 测试您的程序
-
您需要检查有效内存使用情况。在没有虚拟页面支持或完全没有 MMU 的裸机上运行的程序之外,检查分配了多少并不是一个好的资源(在这种情况下,它们将是平等的)。