任何在性能关键代码中使用过“deque”的人都可能已经注意到(至少在 VS2010 附带的 STL 中)块大小为 16 字节。这是 VS2010 附带的头文件的实际片段:
#define _DEQUESIZ (sizeof (value_type) <= 1 ? 16 \
: sizeof (value_type) <= 2 ? 8 \
: sizeof (value_type) <= 4 ? 4 \
: sizeof (value_type) <= 8 ? 2 \
: 1) /* elements per block (a power of 2) */
这不是新信息,请参阅关于 deque<T> 的额外间接以了解有关此 decl 导致性能问题的原因的更多详细信息。
我想在各种算法中使用双端队列,但如果我受限于这个实现,我就不会。绕过这个问题的最佳方法是什么?
1)使用另一个没有这个问题的容器。如果是这样,有人能指点我一个没有 GNU 许可证限制的吗?
2) 创建一个新的容器类来解决这个限制。这个新的容器类不会是 std 命名空间的一部分。
3) 编辑 'deque' 头文件中的 _DEQUESIZ 定义。IMO,我认为这是合法的,因为 _DEQUESIZ 的确切规范不是 STL 定义的双端队列概念的一部分。
4) 向 deque(和相关的迭代器类)添加一个额外的模板参数,以允许在编译时指定块大小。此参数将默认为 _DEQUESIZ 的当前定义。我几乎拒绝这个解决方案,因为现在我使用这个混蛋的 STL 的代码是不可移植的。
5) 游说大会更改 STL,这样我就可以愉快地使用 'deque' 而不会出现性能问题。IMO,这可能比当前的财政悬崖辩论更成功。顺便说一句,我是加拿大人,所以整个众议院 + 参议院 + 总统的繁文缛节令人困惑。