数组与向量,内存布局
Array vs vector, memory layout
有人可以确认两者之间的区别吗:
class A{
public:
std::vector<int> a;
std::vector<int> b;
};
和
class B{
public:
std::array<int, 1000> a;
std::array<int, 1000> b;
};
Class A
对象包含两个指向堆上两个随机分配区域的指针?
相比之下,第二个 class 对象将为两个数组分配连续的内存(取决于对象所在的位置 - 堆栈或堆),这将是连续的。这些数组将彼此相邻(class A
不是这种情况)?
class A
实例中的每个向量实例都将包含三个指针[或两个指针和一个 size_t
又名 std::vector::size_type
,或一个指针和两个 size_t
]。 std::vector<int> a, b
中元素的存储将从堆中分配。 a
和 b
的内容远不能保证彼此接近。 a
和 b
中的每个元素将被连续存储,因此除了额外的指针解引用之外,例如,缓存局部性在两个解决方案之间将非常相似。
但是,如果您执行类似
的操作
A x;
x.a.resize(1000);
x.b.resize(1000);
在新堆上,a
和 b
确实相距不远。
在 B 的实例中,将有两个数组,每个数组都足够大以容纳 1000 个整数,它们之间可能有一些填充。除了填充之外,数组将彼此相邻。
有人可以确认两者之间的区别吗:
class A{
public:
std::vector<int> a;
std::vector<int> b;
};
和
class B{
public:
std::array<int, 1000> a;
std::array<int, 1000> b;
};
Class A
对象包含两个指向堆上两个随机分配区域的指针?
相比之下,第二个 class 对象将为两个数组分配连续的内存(取决于对象所在的位置 - 堆栈或堆),这将是连续的。这些数组将彼此相邻(class A
不是这种情况)?
class A
实例中的每个向量实例都将包含三个指针[或两个指针和一个 size_t
又名 std::vector::size_type
,或一个指针和两个 size_t
]。 std::vector<int> a, b
中元素的存储将从堆中分配。 a
和 b
的内容远不能保证彼此接近。 a
和 b
中的每个元素将被连续存储,因此除了额外的指针解引用之外,例如,缓存局部性在两个解决方案之间将非常相似。
但是,如果您执行类似
的操作A x;
x.a.resize(1000);
x.b.resize(1000);
在新堆上,a
和 b
确实相距不远。
在 B 的实例中,将有两个数组,每个数组都足够大以容纳 1000 个整数,它们之间可能有一些填充。除了填充之外,数组将彼此相邻。