你可以完成这样的事情——但你不可能获得那么多。
首先是性能方面。您正在用时间来换取内存消耗。无论您节省多少内存,每次调用时都必须进行加法和乘法运算end
(好吧,如果它是一个sizeof(vector<t>::value_type) == 1
可以优化乘法的向量)。请注意,大多数基于向量的手写循环代码end
都会在每次循环迭代时调用。在现代 CPU 上,这实际上将是一个重大胜利,因为它允许处理器将更多的东西保存在缓存中;除非内部循环中的那几条额外指令迫使处理器过于频繁地交换指令缓存中的内容)
此外,就向量中的整体内存使用而言,内存节省可能很小,原因如下:
- 内存管理器开销。在大多数内存管理器实现中,来自内存管理器的每个分配(当然需要哪个向量)都会自行增加 16-24 字节的开销。(假设类似
dlmalloc
(UNIX/Linux/etc.)或RtlHeap
(Windows))
- 过度配置负载。为了在最后实现分摊的常量插入和移除,当向量调整大小时,它会调整到向量中数据大小的某个倍数。这意味着分配的典型内存容量向量足够 1.6 (MSVC++) 或 2 (STLPort, libstdc++) 乘以实际存储在向量中的元素数量。
- 对齐限制。如果您将这些向量放入一个数组(或另一个向量)中,请记住该向量的第一个成员仍然是指向已分配内存块的指针。无论如何,这个指针通常需要 8 字节对齐——所以你保存的 4 个字节会丢失到数组中的结构填充中。
我现在会使用 vector 的简单实现。如果您通过内存分析器运行代码并发现摆脱这两个指针可以节省大量资金,那么您可能会实现自己的优化类来满足您的性能特征,而不是依赖于内置的矢量实现。(一个这样的优化类的例子是std::string
在那些实现小字符串优化的平台上)
(注意:我知道的唯一优化Alloc
指针的编译器是 VC11,它尚未发布。虽然 Nim 说当前的 libstdc++ 预发布版本也能做到这一点......)