包含数组的struct vector的分配



想象一个结构

struct A {
int i;
int arr[1000];
};
std::vector<A> vec;

我找不到一个答案来知道数组是否" ar& quot;在我的结构中"会占用堆栈上的空间,或者根本不占用。在这些情况下,虽然向量将分配一个数组& & &;它会在堆上,不会影响我的堆栈但是会影响我的' ar"数组影响我的堆栈?

std::vector <A> vec1 (1000000);
std::vector<std::unique_ptr<A>> vec2 (1000000);

vec1会"摧毁"吗?我的堆栈和更好地使用vec2?

编辑注释

为什么vec1可以比vec2分配更多的元素?

#include <iostream>
#include <vector>
#include <memory>
struct A {
int i;
int arr[1000];
};
int main() {
std::vector<std::unique_ptr<A>> vec1;
std::vector<A> vec2;
std::cout << vec1.max_size() << 'n' << vec2.max_size() << 'n';
}

std::vector是AllocatorAwareContainers之一,默认分配器使用动态分配(通常称为堆分配,这对于具有类堆内存模型的系统是正确的)。

当使用

std::vector<std::unique_ptr<A>> vec1;
std::vector<A> vec2;

都有各自的优缺点。vec1提供了更好的时间来调整容器本身的大小,因为unique_ptr非常小。vec2提供了具有相邻存储的A实例,但由于在每个元素上使用了移动操作,因此调整大小的时间会更高。vec1只为指针分配存储空间,而不是为对象本身分配存储空间,当达到这个数字时,您可能没有剩余的内存来创建A的实例。

在使用vec2时,为了减少自动存储(堆栈)占用,您可能希望完全避免创建A临时方法,并使用emplace_XXX方法在vector的存储中创建A的实例。

最新更新