0

我正在使用 MIPS 和 MARS 模拟器学习汇编语言的基础。标题包含了我的问题,但我会尝试用一个例子来扩展它。假设我们想从键盘读取一个字符串(最多 200 个字符)。我们必须有办法进行

1)我们在静态数据段上分配201个字节,做系统调用读取字符串,然后通过“字符串”地址引用它

.data
string:     .space  201

.text
li  $v0, 8
la  $a0, string
li  $a1, 201
syscall

2)我们通过 sbrk 函数(MARS 上唯一可用的)请求堆上的 201 个连续字节,然后用输入字符串填充它们。

li  $v0, 9
la  $a0, 201
syscall
move    $s0, $v0

li  $v0, 8
move    $a0, $s0
li  $a1, 201
syscall

两种方法的优缺点是什么?我总是在 MIPS 示例中看到第一种方法,但我不明白为什么不使用第二种方法。

提前致谢 :)

4

1 回答 1

1

第一种方法适用于只需要固定(少量)缓冲区的简单程序。而且不需要释放内存,这对于初学者来说更简单。

动态分配方法为您的进程的内存使用提供了更大的灵活性。
例如,您可能有一个仅临时需要的缓冲区,并且由于内存是一种有限资源,您可能希望动态分配该内存,以便在不再需要时释放它 - 而不是静态分配的内存在流程的整个生命周期内保持分配状态。
也有可能你不知道编译时需要多少内存,因为它可能取决于某些用户输入。这是动态内存分配有用的另一种情况。

动态分配内存的缺点是您(程序员)必须跟踪所有分配。也就是说,您必须确保在某个时候释放已分配的内存,但您还需要确保您的程序在释放它之前已使用该内存(或者您最终可能会悬空指针)。

于 2013-04-28T10:16:19.863 回答