[英]Does converting vectors between Rcpp and C++ (using Rcpp::as or Rcpp::wrap) create a new vector and copy elements?
[英]C++: What to insert in vectors - pointers or references, when does a vector copy it's elements?
假设我有复杂的对象,比如包含大量成员的结构 - 我想将它们存储在向量中。
现在,vector :: push_back(...)通过引用调用(而不是按值调用)工作,因此在第一时间不会复制传递的对象。 但是后来呢? 向量内部存储指针或直接引用吗? 当向量需要扩展时,包含的元素本身是复制还是它们的地址?
这最终导致了一个问题,如果 - 对于大型对象 - 对象本身应该存储在向量中,或者指向这些对象的指针。 那有什么最好的做法吗?
vector::push_back(...)
通过引用调用(而不是按值调用)工作,因此在第一时间不传递传递的对象
vector::push_back()
存储要添加到其中的对象的副本。
向量内部存储指针或直接引用吗?
向量内部存储元素的方式是实现细节,但复杂性和行为要求几乎没有变化的余地。 Vector将元素存储在连续的内存位置,就像数组一样。
当向量需要扩展时,包含的元素本身是复制还是它们的地址?
当向量扩展时,它需要将所有对象复制到新的连续内存,这也是一个实现细节。 如果元素是指针,则指针本身将被复制。
对象本身应存储在向量中,或者指向这些对象的指针。 那有什么最好的做法吗?
如果您的对象较大并且您不想将它们放在向量中,那么您可以在向量中存储指针,但是不要将原始指针存储在向量中,根据您的要求使用合适的智能指针 。 它确保完美的RAII ,您无需担心存储器管理。
std::vector::push_back
保存对象的副本 。
如果你通过避免复制需要性能,那么你可以使用指针向量。
std::vector<BigObject*> objects; //manage memory yourself
或者您可以使用某种智能指针,以避免自己管理内存。 例如,如果编译器支持std::unique_ptr
则可以使用它:
std::vector<std::unique_ptr<BigObject>> objects;
如果你使用指针(或智能指针),那么复制仍然存在,但这一次,复制是针对指针(或智能指针)完成的,这要便宜得多。
来自@ Loki的评论:
或者您可以使用
boost::ptr_vector<>
来设计保存指针,并在访问时返回引用,从而使标准算法变得容易,因为它们都期望对象。
实际上,如果你在向量上迭代而不是向它添加对象,那么通过添加对象将大大超过指针,因为它们在内存中是连续的。
但是,如果你正在向向量和向量进行更多的添加和擦除,那么与迭代它相比,指针将更有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.