我正在学习使用MIPS和MARS模拟器的汇编语言的基础。 标题包含了我的问题,但我会尝试用一个例子来扩展它。 假设我们想要从键盘读取一个字符串(最多200个字符)。我们必须采取行动
1)我们在静态数据段上分配201个字节,进行系统调用以读取字符串,然后通过“string”地址引用它
.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示例中看到第一种方法,但我无法理解wya第二种方法没有被使用。
提前致谢:)
答案 0 :(得分:1)
第一种方法在一个只需要固定(小)数量的缓冲区的简单程序中就可以了。并且没有必要释放内存,这使初学者更容易。
动态分配方法为进程的内存使用提供了更大的灵活性。
例如,您可能只有一个临时需要的缓冲区,并且由于内存是有限资源,您可能希望动态分配该内存这样你就可以在不再需要它时释放它 - 而不是静态分配的内存,这些内存将在你的整个过程中保持分配。
还有可能你不确切地知道在编译时你需要多少内存,因为它可能取决于例如在某些用户输入上。这是动态内存分配有用的另一种情况。
动态分配内存的缺点是你(程序员)必须跟踪你的所有分配。也就是说,你必须确保释放你在某些时候分配的内存,但是你还需要确保你的程序在你释放之前完成了那段内存(或者你可能最终得到它悬空指针)。