As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened, visit the help center提供指导。




7年前关闭。




在确定任务的最佳数据结构时,需要考虑三个方面:
  • 功能:数据结构是否提供我需要的操作
  • 性能:这些操作
  • 有多快
  • 内存消耗:数据结构使用
  • 多少内存

    第一个考虑因素可以通过检查数据结构的接口(interface)来找到,第二个考虑因素只能在基准测试中进行衡量。但是,如果数据结构仅提供一种计算其当前使用的内存的方法,则第三种方法非常简单,否则很难。

    STL数据结构没有这种方法。但为什么?对STL中的所有数据结构实现这种方法将非常简单。对于作为客户端的我来说,编写这样的方法非常困难,因为我必须熟悉内部实现。另外,这些实现隐藏在私有(private)成员的后面,因此我根本无法访问它们。

    那么为什么他们被排除在外呢?现在,选择数据结构时,许多其他的实现,如目前公布的谷歌B树的实现确实提供了这些方法。比较这些数据结构很容易。但是,当询问有关内存消耗的STL数据结构将如何执行时,我基本上能做的只是猜测。

    我找不到任何理由可以省去这些方法来作为设计决策。另外,C++是为高性能和低内存占用量而优化的语言。尤其是用这种语言,我认为评估数据结构的内存消耗是一个很常见的用例。因此,我也不能认为它们被排除在外是因为没有人会使用它们。另外,STL也是一个相当成熟的库,因此原因也不应该仅仅是该库不够详细。那么,省略这些方法的原因可能是什么?

    最佳答案

    全局,毫无疑问,因为容器无法知道多少
    它使用的内存。它可以(确实)有一个函数,该函数返回
    它包含的元素数,例如std::vector,其中
    容器总体上具有功能
    (std::vector<>::capacity)告诉您它有多少个元素
    已分配。但是它没有办法考虑任何额外的
    这样的分配的开销(肯定会有一些)。这样
    开销将取决于分配器,通常取决于更低的级别
    分配器使用的函数。在最低级别,甚至没有
    清楚这是什么意思:如果我malloc一个字节,则malloc可能在
    事实根据其“分配”的概念分配16。但是如果
    当我分配一个字节时,malloc在其池中没有可用的内存,它
    将进入系统,可能分配一个兆字节或更多。所以呢
    这种情况下的内存使用情况是:1个字节,16个字节还是一个兆字节或更多?

    关于c++ - C++ STL:为什么STL数据结构不提供测量内存消耗的功能? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15191253/

    10-13 06:58