在结构中,为了最小化填充,应该将元素声明为最大到最小,正确吗?
std :: vector在一个不一定连续的部分分配内存,对吗?
在一个结构中,当考虑它在结构中相对于填充的位置时,我应该考虑std :: vector多少位?
答案 0 :(得分:4)
在结构中,为了最小化填充,应该将元素声明为最大到最小,正确吗?
这取决于。在某些情况下,您可能正在优化缓存行为,这可能不一定会导致排序。在大多数实现中,以这种方式排序将导致最小尺寸的结构(具有最少的填充),但是标准或类似的东西不能保证这种结构。 1
std :: vector在一个不一定连续的部分分配内存,对吗?
这是不正确的。 vector
需要使用一个连续的部分。见N3936 23.3.6.1/1:
vector
是一个支持随机访问迭代器的序列容器。此外,它支持(摊销)最后的恒定时间插入和擦除操作;在中间插入和擦除需要线性时间。存储管理是自动处理的,但可以提供提示以提高效率。向量的元素是连续存储的,这意味着如果v
是vector<T, Allocator>
,其中T
是除bool
以外的某种类型,那么它就会服从&v[n] == &v[0] + n
对于所有0 <= n < v.size()
。
在一个结构中,当考虑它在结构中相对于填充的位置时,我应该考虑std :: vector多少位?
Vector无法查看结构中的成员;它只知道尺寸。
1 考虑一个假设的机器,它有4个字节int
s,并且要求所有内容都是5字节对齐的。 (我不知道这样的机器,但标准的编写方式使得这样的机器成为可能)在这种情况下,结构如下:
struct X
{
int a;
int b;
char c;
char d;
};
会浪费空间,因为
struct X
{
int a;
char c;
int b;
char d;
};
将每个char
存储到未使用的5 th 字节中。这就是为什么标准定义了这个实现。
答案 1 :(得分:1)
我认为你在想象这样的东西:
struct foo {
// ...
std::vector<T> vec;
// ...
};
我认为你缺少的是std::vector
对象本身与它为元素分配的内存之间的区别。 std::vector
本身占用sizeof(std::vector)
个字节,因此,如果您考虑填充,则至少会将这么多字节贡献给它所包含的结构。
在内部,std::vector
对象在其他地方分配存储元素的连续内存区域。为了增加或减小大小,std::vector
可以在添加或删除元素时分配不同大小的内存。但是,这对你的问题是无关紧要的,因为这个内存不会导致std::vector
的大小,也不会影响它所属的结构的大小。