如果我要在c ++中实现三种排序算法,然后想检查它们的空间复杂性/ RAM量,则会占用它们。我该怎么办?我可以使用任何标准库或第三方库吗?
答案 0 :(得分:1)
这是在Unix / Linux下吗? 如果是这样,您可以在程序的开头和结尾计算 sbrk (0)返回的值之间的差。这样可以得出运行期间的堆内存总量。
请参见sbrk(2)上的手册页。 “ 以0增量调用sbrk()可用于查找程序中断的当前位置。”
(附录) 使用仅分配一个大向量的玩具C ++程序,事实证明GNU C ++运行时倾向于使用mmap()而不是sbrk()来分配非常大的对象。
使用strace:
$ strace ./vec1.x |& grep map
...
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f4ac2b42000
mmap(NULL, 800002048, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f4a93051000
...
$
您也可以使用 brk 代替 map 使用grep。
使用Valgrind:
$ valgrind ./sbrk1.x
...
==22223== total heap usage: 3 allocs, 3 frees, 800,073,728 bytes allocated
....
$
希望有帮助!
答案 1 :(得分:0)
如果您想检查它们的复杂性-作为一种渐近函数-您实际上将无法凭经验做到这一点,例如通过挂钩分配和取消分配。您需要通过仔细分析代码来得出最大分配空间的渐近边界。从理论上讲,一般情况下不可能自动执行此任务,因为您的程序可能会非常复杂。
在实践中,我建议您尝试组织分配和取消分配,以免它们在整个地方自发发生。这应该可以帮助您限制最大分配量。
在某种程度上,您需要一个软件工具来衡量运行期间分配的数量-对于StackOverflow来说是不合时宜的,您应该在softwarerecs.stackexchange.com上询问。