assembly 在C++中,添加元素到动态数组是通过创建一个新数组来完成的,在Python这样的语言中,它在汇编级做类似的事情吗?

zfciruhq  于 2022-11-13  发布在  Python
关注(0)|答案(2)|浏览(93)

我使用了许多编程语言,它们都有类似.push().append()的东西来将对象添加到动态数组的末尾。现在,我学了一些C++,并注意到它不支持这一点,但我必须实现一个手动完成此操作的函数,此函数创建一个新的临时数组,该数组比旧数组长一个元素,循环并复制每个元素,添加新对象,删除旧数组,并将临时数组复制到旧数组中。我已经使用过的允许.push()这样的函数在汇编级做同样的事情吗?

ctehm74n

ctehm74n1#

在C中,我们也有自己进行内存管理的结构:std::vector<>。建议在适当的时候在普通数组上使用std::vector<>std::vector<>维护一个缓冲区,并且只在必要的时候(即当缓冲区太小而不能容纳新插入的元素时)才调整大小+移动;那么它通常膨胀到两倍或类似的程度。
在其他语言中,你也需要实现某种内存管理。然而,这种大小调整是否必要并不简单:因为大多数脚本语言实际上都是在低级语言中实现的,通常是C/C
/C--。因此,std::vector<>(甚至std::map<>)可能会在后台使用。然而,最终,必须有人实现resizing 1,因为内存通常被视为一维数组,从中分配;您不一定可以无限地扩展分配。
1注意:理论上,在某些体系结构上,可以将此委托给虚拟内存管理,并使用段寄存器作为指针,索引寄存器作为偏移量,并让分页将segment:index与物理地址相关联;但是现在已经很少用了。

goucqfw6

goucqfw62#

是的,他们做的。例如python list(是数组,而不是列表)做的完全一样。
注意事项:你不需要自己实现它,这就是C++中STL的作用,动态数组的相关数据结构是std::vector,除了std::vector在增加数组方面更聪明之外,增加一个以上的元素,这样就不必每次推送都复制以前的所有数据。事实上,每次推送的摊销成本为O(1)。如果你知道你有多少数据,那么最好还是从一开始就分配合适的空间。

相关问题