我看到SRFI 4没有提到矢量的大小调整。我正在使用f64vectors(我需要快速访问),我希望能够快速调整它们的大小(类似于C中的realloc),而不必复制整个矢量。
由于我没有找到任何对“resize-f64vector”程序的引用,我想知道为什么它不存在(如果制作一个新的向量并且复制是我唯一的选择)。
答案 0 :(得分:1)
Gambit-C Scheme可以shrink vectors,但是如果你想要一个普通的解决方案,那你就不走运了。您可以使用大于所需大小的向量来避免频繁的重新分配和复制,例如每次需要更多空间时加倍向量并保持真正使用的插槽数量。
答案 1 :(得分:1)
有几个原因。
通过在语言中使用同类向量类型,编译器可以对性能做出一些可靠的假设。理想情况下,在一些高度优化的场景中,对向量的引用可能只是一块内存块。不是说任何Scheme实现实际上都是这样做的,但他们可以做到这一点。
鉴于此,几乎每次调整矢量大小时,最像是复制到可以容纳新矢量的新内存位置。只是原始事实与记忆的布局方式。
所以,鉴于此,您可以看到我所拥有的是一个指向内存的指针,如果该缓冲区被更改并移动,那么我的指针不再有效。它指向旧记忆。
但是,如果我可以假设我的内存大小永远不会改变,那么这是一个安全的选择,作为编译器的优化,我的向量的内存永远不会改变,并且我可以表示并引用该向量为只是一个指向记忆的指针。
这是同类向量的主要目标,可以更快地访问特定的内存块。
由于调整向量大小几乎不可避免地涉及副本,因此您也可以将该副本显式化,使编译器完全可以看到对向量的引用中的更改。