![](/img/trans.png)
[英]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.