繁体   English   中英

C ++ std :: vector连续节的大小

[英]C++ Size of std::vector Contiguous Section

在一个结构中,为了最小化填充,应该将元素声明为最大到最小,对吗?

std :: vector在不一定是连续的部分上分配内存,对吗?

在一个结构中,考虑填充时将std :: vector放置在该结构中时,应该考虑多少个std :: vector?

在一个结构中,为了最小化填充,应该将元素声明为最大到最小,对吗?

那要看。 在某些情况下,您可能正在针对缓存行为进行优化,但这不一定会导致该排序。 在大多数实现中,以这种方式进行排序将导致结构最小(填充最少),但是标准或类似方法无法保证。 1个

std :: vector在不一定是连续的部分上分配内存,对吗?

那是不对的。 vector需要使用一个连续的部分。 参见N3936 23.3.6.1/1:

vector是支持随机访问迭代器的序列容器。 另外,它在末尾支持(摊销)恒定时间插入和擦除操作。 在中间插入和擦除需要线性时间。 存储管理是自动处理的,尽管可以提供一些提示以提高效率。 向量的元素是连续存储的,这意味着如果vvector<T, Allocator> ,其中Tbool以外的某种类型,则它对所有0 <= n < v.size()都服从&v[n] == &v[0] + n的标识0 <= n < v.size()

在一个结构中,考虑填充时将std :: vector放置在该结构中时,应该考虑多少个std :: vector?

Vector看不到有关结构中成员的任何信息; 它只知道大小。


1考虑一个假设机器,它具有4个字节的int并且要求所有内容都对齐5个字节。 (我不知道这样的机器,但是以这样的机器可能的方式编写标准)在这种情况下,结构如下:

struct X
{
    int a;
    int b;
    char c;
    char d;
};

会浪费空间,因为

struct X
{
    int a;
    char c;
    int b;
    char d;
};

将每个char存储到未使用的 5 字节中。 这就是为什么标准未定义此实现的原因。

我认为您正在想象这样的事情:

struct foo {
  // ...
  std::vector<T> vec;
  // ...
};

我认为您所缺少的是std::vector对象本身与其为其元素分配的内存之间的区别。 std::vector本身占用sizeof(std::vector)个字节,因此如果考虑填充,它将至少为包含在其中的结构贡献这么多字节。

在内部, std::vector对象在存储元素的其他位置分配一个连续的内存区域。 为了增加或减少大小, std::vector在添加或删除元素时可能会分配不同大小的内存。 但是,这与您的问题无关,因为此内存不会增加std::vector的大小,因此也不会增加其所属结构的大小。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM