Почему нет способа изменить размеры векторов SRFI-4 в схеме? - PullRequest
3 голосов
/ 26 марта 2010

Я вижу, что SRFI 4 не упоминает изменение размеров векторов. Я использую f64vectors (для которых мне нужен быстрый доступ), и я хотел бы иметь возможность быстро изменить их размер (аналогично тому, что realloc делает в C) и не обязательно копировать весь вектор.

Поскольку я не нашел ссылок на процедуру "resize-f64vector", я хотел бы знать, почему ее не существует (и если создание нового вектора и копирование - мой единственный вариант).

Ответы [ 2 ]

1 голос
/ 17 мая 2010

Пара причин.

Имея однородный векторный тип в языке, компилятор может сделать некоторые твердые предположения о производительности. В идеале, в некоторых сильно оптимизированных сценариях ссылка на вектор может быть немного больше, чем точка на блок памяти. Я не говорю, что реализации Scheme действительно делают это, но они могут это делать.

Учитывая, что почти каждый раз при изменении размера вектора это больше похоже на копирование в новую область памяти, которая может содержать новый вектор. Просто грубая истина в том, как устроена память.

Итак, учитывая это, вы можете видеть, что если все, что у меня есть, это указатель на память, если этот буфер изменен и перемещен, то мой указатель больше не действителен. Это указывает на старую память.

Но если я могу предположить, что размер моей памяти никогда не изменится, то вполне вероятно, что в качестве оптимизации компилятором память никогда не изменится, и что я могу представить и ссылаться на этот вектор как просто указатель на память.

И это основная цель однородных векторов - обеспечить потенциально более быстрый доступ к специализированным блокам памяти.

Поскольку изменение размера вектора почти неизбежно связано с копией, вы также можете сделать эту копию явной, предоставив компилятору полную видимость изменений в ссылке на вектор.

1 голос
/ 17 мая 2010

Схема Gambit-C может сокращать векторы , но если вам нужно общее решение, вам не повезло. Вы можете использовать векторы большего размера, чем необходимо, чтобы избежать частого перераспределения и копирования, например удваивать вектор каждый раз, когда вам нужно больше места, и вести подсчет количества реально используемых слотов.

...