C++ 使用对象或指向对象的指针作为类成员和内存分配
这里也提出了类似的问题: 所以我会保持简短 假设我有一个包含三个stl向量的对象。我的想法正确吗?如果他们是这个类的普通成员,他们的记忆将是整个对象的“共同”记忆?e、 我的记忆看起来像10块向量A,5块向量B,然后是15块向量C。然后我会在向量A中插入更多的对象,这样空间就会耗尽整个结构,包括向量B和向量C需要移动吗 那是指针的论点吗?或者向量在内部只是指向分配内存的指针?同样的问题也适用于列表等 对于重定向的成本和复制小对象的成本,有什么经验法则吗?可能是5指针重定向=1整数副本C++ 使用对象或指向对象的指针作为类成员和内存分配,c++,class,pointers,member,C++,Class,Pointers,Member,这里也提出了类似的问题: 所以我会保持简短 假设我有一个包含三个stl向量的对象。我的想法正确吗?如果他们是这个类的普通成员,他们的记忆将是整个对象的“共同”记忆?e、 我的记忆看起来像10块向量A,5块向量B,然后是15块向量C。然后我会在向量A中插入更多的对象,这样空间就会耗尽整个结构,包括向量B和向量C需要移动吗 那是指针的论点吗?或者向量在内部只是指向分配内存的指针?同样的问题也适用于列表等 对于重定向的成本和复制小对象的成本,有什么经验法则吗?可能是5指针重定向=1整数副本 感谢您,
感谢您,集合类是使用指针在内部实现的,您不必担心它们会耗尽空间。至于复制开销,不要担心,除非您通过分析代码来证明这是一个问题。因为
std::vector
是动态调整大小的,所以它们不可能将元素存储为成员或成员数组。请记住,对象的大小在编译时是已知的
即使如此,关于不使用指针成员仍然有一些话要说。考虑这种类型:
struct fat {
array<double, 30> data;
array<long, 30> more_data;
array<char, 30> too_much_data;
};
价值语义只是让事情变得更简单;直到太多的复制或大小或其他(首先测量)之前,才应该使用(动态)容器和智能指针(它们本身遵循值语义)
编辑
std::vector
总体来说并不“坏”(无论是否作为成员),请参见评论中与Tony的讨论
假设我有一个包含三个stl向量的对象。我的想法正确吗?如果他们是这个类的普通成员,他们的记忆将是整个对象的“共同”记忆?e、 我的记忆看起来像10块向量A,5块向量B,然后是15块向量C
每个向量
在包含对象中占据固定大小,与向量当前存储的元素数量无关。向量
的值类型
(例如向量
具有值类型
int
)很可能不会影响包含的向量
对象本身的大小:只有分配的堆量存储向量
所需的存储容量(所以它们可能是8或16或32字节,但都是相同的,但不是10个“块”(不管是什么),5个块和15个)
那么,一旦我在向量A中插入更多的对象,这样空间就会耗尽整个结构,包括向量B和向量C,需要移动吗
将元件插入A
只能导致A
中的现有元件移动(当容量超过时)。B
和C
永远不会受到影响
那么这是指针的参数吗?还是向量在内部只是指向分配内存的指针
是的,这是一个参数……是的,vector
s已经使用指针指向存储实际value\u type
元素的连续内存
同样的问题也适用于列表等
是的,list
s也将它们的value\u type
元素存储在堆上,并且嵌入或派生自list
的对象的大小不受list
上的操作的影响
关于重定向的成本与复制小对象的成本,有什么经验法则吗?可能是5个指针重定向=1个整数复制?在这里输入code
C++在太多的平台上运行,因此没有很好的经验法则。即使在x86处理器上,指令集、内核、缓存大小、CPU供应商/型号/代数等方面的差异也可能是巨大的。如果间接寻址导致内存页错误,则成本最高,这非常取决于程序的总体情况在机器上执行。如果您愿意,请对运行该程序的真实计算机进行基准测试,直到您找到统计相关且稳定的结果。很高兴您一直在思考这个问题并写得很好,但您的推理有两个缺陷:1)使用
vector
的动态分配具有调整大小并继续运行的显著优势,而编译时数组大小调整在元素较少时会浪费内存,然后完全失败。2)<>代码> vector < /COD>确实有价值语义(C++允许你创建具有值语义的用户定义类型是一个关键的和非常慎重的语言特征),因此,代码>向量 s是通过默认生成的析构函数和复制构造函数自动处理的。@托尼,你是正确的,我并不主张使用std::array
而不是std::array
。我建议不要过早地使用std::vector
而不是std::array
作为成员,因为这样会使对象更精简。在std::array
或std::vector
(是否作为成员)之间选择是另一个讨论,您已经提供了一些关于这个主题的论据。@Luc:如果您的“更精简的对象”警告是说大小为N的vector
将不会像大小为N的数组那样“精简”,那当然是正确的,但是,当填充的大小明显小于容量N,并且根据需要调整大小超过当前容量时,向量肯定会自行调整vector
s值语义使它们成为行为良好的成员,并且应该优先选择它们,而不是一般使用的数组。习惯性地使用数组
fat* so_much_stuff = new fat[30]();
// Better:
std::vector<fat> get_rid_of_it_already(30);