【问题标题】:Array vs vector, memory layout数组与向量,内存布局
【发布时间】:2015-02-08 22:39:22
【问题描述】:

有人可以确认以下之间的区别:

class A{
    public:
        std::vector<int> a;
        std::vector<int> b;
};

class B{
    public:
        std::array<int, 1000> a;
        std::array<int, 1000> b;
};

A 类对象包含两个指向堆上两个随机分配区域的指针?

相比之下,第二类对象将为两个数组分配连续的内存(取决于对象所在的位置 - 堆栈或堆),这将是连续的。数组将彼此相邻(A 类不会出现这种情况)?

【问题讨论】:

  • 基本上,是的,虽然 a) std::vector 通常会存储多个指针,并且 b) 不能保证 B::aB::b 在它们之间没有填充(尽管实际上很可能是这种情况)。
  • 是的,没错。
  • 此外,向量也将其数据存储在连续的内存块中……
  • 谢谢大家。随时有人提出答案,我会接受。 @Igor 关于向量的好点不只是一个指针!
  • @user997112:我已经添加了答案...

标签: c++ arrays vector


【解决方案1】:

class A 实例中的每个向量实例都将包含类似于三个指针的内容[或两个指针和一个size_t 又名std::vector::size_type,或一个指针和两个size_t]。 std::vector&lt;int&gt; a, b 中元素的存储空间将从堆中分配。 ab 的内容远不能保证彼此接近。 ab 中的每个元素都将连续存储,因此除了额外的指针取消引用之外,例如,两个解决方案之间的缓存局部性将非常相似。

但是,如果你做类似的事情

A x;
x.a.resize(1000);
x.b.resize(1000); 

在一个新的堆上,ab 确实相距不远。

在 B 的一个实例中,将有两个数组,每个数组都足够容纳 1000 个整数,它们之间可能有一些填充。除了填充之外,这些数组将彼此相邻。

【讨论】:

    猜你喜欢
    • 2019-06-09
    • 2019-07-24
    • 2015-07-21
    • 2010-10-03
    • 1970-01-01
    • 2023-03-27
    • 2023-04-09
    相关资源
    最近更新 更多