[英]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_vector
和profileVector
非常容易混淆。 考慮重命名其中之一。 此外,還不清楚filtered_profile
與復制之間的關系。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.