2010-03-25 58 views
3

我看到SRFI 4沒有提到調整矢量大小。我正在使用f64vectors(爲此我需要快速訪問),我希望能夠快速調整它們的大小(類似於C中的realloc),並且不一定要複製整個向量。爲什麼沒有辦法調整Scheme中的SRFI-4載體大小?

因爲我沒有找到任何對「resize-f64vector」過程的引用,所以我想知道爲什麼它不存在(並且如果製作新的向量和複製是我唯一的選擇)。

回答

1

幾個原因。

通過在該語言中使用同類向量類型,編譯器可以對性能做出一些可靠的假設。理想情況下,在一些高度優化的場景中,對矢量的引用可能只不過是指向一塊內存的一點。沒有說任何Scheme實現實際上這樣做,但他們可以做到這一點。

鑑於這一點,幾乎每次矢量調整大小時,它最像是被複制到一個可以容納新矢量的新內存位置。只是記憶佈局方式的原始真相。因此,你可以看到如果我擁有的是一個指向內存的指針,如果該緩衝區被改變並移動,那麼我的指針不再有效。它指向舊的記憶。

但是如果我可以假設我的內存大小永遠不會改變,那麼這是一個安全的選擇,作爲編譯器的優化,我的向量的內存永遠不會改變,並且我可以表示並引用那個向量只是一個指向內存的指針。

而這就是同質載體的主要目標,它可以更快地訪問專門的內存塊。

由於調整矢量的大小几乎不可避免地涉及副本,因此您可以使該副本顯式化,以使編譯器完全可見對矢量引用的更改。

+0

謝謝你的回答!這就是我所錯過的:「幾乎不可避免地涉及副本」 - 「幾乎不可避免」的部分很重要。 :-) – Jay 2010-05-18 10:34:22

+0

C++提供可調整大小的矢量,其大小不涉及大部分時間的複製... – rafak 2012-02-21 16:49:33

+1

@rafak不是真實的,用C++分配比所需矢量更大的大小,只需調整大小即可,容量成員功能。 – jozefg 2012-10-17 03:41:14

1

Gambit-C Scheme可以shrink vectors,但如果你想要一個通用的解決方案,你是不走運的。您可以使用比需要的更大尺寸的矢量以避免頻繁的重新分配和複製,例如每次需要更多空間並保持實際使用的插槽數量時,將矢量加倍。

相關問題