这里也提出了类似的问题:
Class members that are objects - Pointers or not? C++
所以我会保持简短。
假设我有一个包含三个stl向量的对象。我的想法是正确的,如果他们是班级的正式成员,那么他们的记忆对于整个对象将“在一起”吗?例如我的记忆看起来像10块矢量A,5块矢量B,然后15块矢量C.然后我将更多的物体插入矢量A,这样空间耗尽整个结构,包括矢量B和C需要移动?
那么这是指针的论据吗?或者向量内部只是指向已分配内存的指针?列表等也会出现同样的问题......对于重定向的成本与复制小对象的成本,是否有任何经验法则?也许沿着5指针重定向= 1整数复制?
由于
答案 0 :(得分:2)
假设我有一个包含三个stl向量的对象。我的想法是正确的,如果他们是班级的正式成员,那么他们的记忆对于整个对象将“在一起”吗?例如我的记忆看起来像10块矢量A,5块矢量B,然后15块矢量C。
每个vector
在包含对象中占用固定大小,与vector
当前存储的元素数量无关。 value_type
的{{1}}(例如vector
vector<int>
value_type
)可能不会影响所包含的int
的大小对象本身:只有vector
所需的堆分配存储量才能保持其存储容量(所以它们可以说是8或16或32字节,但都是相同的,但不是10“阻止“(无论可能是什么),5个街区和15个。”
然后,一旦我将更多对象插入向量A,以便空间用完整个结构,包括向量B和C需要移动吗?
将元素插入vector
只会导致A
中的现有元素被移动(超出容量时)。 A
和B
永远不会受到影响。
那么这是指针的论据吗?或者向量内部只是指向已分配内存的指针?
是的,这是一个参数......这是一个好的,是的,C
已经做使用指向存储实际vector
元素的连续内存的指针
同样的问题将用于列表等......
是,value_type
也将他们的list
元素存储在堆上,嵌入或派生自value_type
的对象的大小不受list
上的操作的影响
对于重定向的成本与复制小对象的成本,是否有任何经验法则?也许沿着5指针重定向的行= 1整数副本?
list
C ++在太多平台上运行,因此有很好的经验法则。即使在x86处理器上,指令集,#核心,高速缓存大小,CPU供应商/型号/生成等的差异也可能是巨大的。如果导致内存页面错误,间接是最昂贵的,并且这非常依赖于机器上程序执行的整体情况。如果您在意,请对运行该程序的真实计算机进行基准测试,直到找到具有统计相关性和稳定性的结果。
答案 1 :(得分:1)
集合类是使用指针在内部实现的 - 您不必担心它们的空间不足。至于复制开销,除非你通过分析代码证明这是一个问题,否则不要担心。
答案 2 :(得分:0)
由于std::vector
是动态调整大小的,因此它们不能将其元素存储为成员或成员数组。请记住,对象的大小在编译时是已知的。
即使这样,还有关于不使用指针成员的事情。考虑这种类型:
struct fat {
array<double, 30> data;
array<long, 30> more_data;
array<char, 30> too_much_data;
};
其中array
可以是std::array
,std::tr1::array
或boost::array
;它只是用作大型机器的替身。对fat
个对象来说,你是对的,这是正确的。将成员更改为指针(或动态数组或任何类型的道德等价物)还为时过早:首先按原样使用对象,然后如果它太大或有问题,您可以动态分配它们成员:
fat* so_much_stuff = new fat[30]();
// Better:
std::vector<fat> get_rid_of_it_already(30);
价值语义只会让事情变得更容易;它只是在复制或大小太多(或先测量)而不是之前,你应该使用(动态)容器和智能指针(它们本身遵循值语义)。
修改强>
std::vector
一般来说并不“坏”(作为成员与否),请参阅评论中与Tony的讨论。