`AnnoyIndex::save()` 是否应该是一个 `const` 方法?
或者:为什么 `save()` 需要先 `unload()`,然后再 `load()` 索引呢?直观上,我会认为 `save()` 操作不会修改正在保存的对象。 为了提供更多的背景信息:我维护了一个包装库(https://GitHub.com/knncolle),该库为各种邻居搜索算法提供了一个通用接口。最近扩展了这个接口的是一个预先构建的搜索索引的保存/加载机制。在设计接口的部分时,我定义了保存方法为 `const`,这是我表示可以在执行其他 `const` 操作(例如在索引上进行搜索)的同时安全地保存索引的一种方式。 这种方法在其他一些 NN 算法中运行得相当好,直到我实现了这些方法用于 Annoy。`AnnoyIndex::save()` 方法不是 `const`,我无法假装它是 `const`,因为那样会误导用户,例如尝试在 `unload()` 在 `save()` 中运行的同时进行搜索。 目前的解决方案是提取 `_nodes` 数组并手动保存,这对于 `AnnoyIndex::load()` 来说是可行的。然而,如果 `AnnoyIndex::save()` 是 `const`,就很方便了。 总之,如果 `save()` 不在结尾执行 `unload()` + `load()` 这段操作,它就可以像 `AnnoyIndexInterface` 中的许多其他方法一样标记为 `const`。我承认我不明白为什么 `unload()` + `load()` 是必要的 - 毕竟,在调用 `save()` 之前,索引运行得非常好,所以为什么要重新加载呢?但是如果重新加载确实是不可避免的,那么也许可以将其放入一个单独的方法中,先调用 `save()`(现在是 `const`),然后调用 `unload()`,最后调用 `load()`。
内容来源: spotify/annoy