簡體   English   中英

將memcpy與unique_ptr一起使用到矢量

[英]Using memcpy with a unique_ptr to a vector

我正在編寫一段代碼,在這里我需要將一個指針復制到一個矢量或它的一部分-定義為:

std::unique_ptr<std::vector<unsigned int>> filtered_profile_ptr = 
  std::make_unique<std::vector<unsigned int>>((int)baselength);

指向向量的另一個指針-定義為:

std::unique_ptr<std::vector<unsigned int>> profile_vector = 
  std::make_unique<std::vector<unsigned int>>(length + filter_size - 1);

我正在使用memcpy函數-像這樣:

memcpy(&(*profile_vector)[0], &(*profileVector)[length - win_size_left], win_size_left * sizeof(unsigned int));
memcpy(&(*profile_vector)[win_size_left], &(*profileVector)[0], length * sizeof(unsigned int));
memcpy(&(*profile_vector)[length + win_size_left], &(*profileVector)[0], win_size_right * sizeof(unsigned int));

我的問題是:以這種方式使用memcpy是否會提供一些隱藏的問題,在某些情況下與內存有關,或者與緩沖區有關。

PS代碼運行正常,我只關心那些看不見的問題。

首先,幾乎沒有理由動態分配向量。 通過使用自動存儲,您可以大大簡化程序:

std::vector<unsigned int> filtered_profile(baselength);
std::vector<unsigned int> profile_vector(length + filter_size - 1);

memcpy隱藏問題是它僅適用於瑣碎的可復制類型-對於其他類型,行為未定義。 當然,您的副本此刻可能微不足道(假設我已經正確讀取了您的代碼,因為您正在處理向量的內部緩沖區),但是無需依靠這些細微的細節:您可以使用std::copy相反也適用於非平凡的類型。

除非我誤讀了您的程序,否則該程序應該執行您的記憶。 除此之外,它適用於沒有智能指針的向量。 至少對我來說,這更具可讀性:

assert(std::size(profileVector) >= length);
auto srcB = std::begin(profileVector); // begin
auto srcE = srcB + length;             // end
auto srcL = srcE - win_size_left;      // left from end
auto srcR = srcB + win_size_right;     // right from begin


assert(std::size(profile_vector) >= win_size_left + length + win_size_right);
auto dst0 = std::begin(profile_vector);
auto dst1 = dst0 + win_size_left;
auto dst2 = dst1 + length;

std::copy(srcL, srcE, dst0);
std::copy(srcB, srcE, dst1);
std::copy(srcB, srcR, dst2);

PS注意,命名兩個變量profile_vectorprofileVector非常容易混淆。 考慮重命名其中之一。 此外,還不清楚filtered_profile與復制之間的關系。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM