我正在编写一段代码,在这里我需要将指针复制到向量或向量的一部分-定义为:
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是否会提供一些隐藏的问题,在某些情况下与内存有关,或者与缓冲区有关。
P.S。代码运行良好,我只关心那些看不见的问题。
答案 0 :(得分:0)
首先,几乎没有理由动态分配向量。您可以使用自动存储功能来简化程序:
std::vector<unsigned int> filtered_profile(baselength);
std::vector<unsigned int> profile_vector(length + filter_size - 1);
memcpy
的隐藏问题是它仅适用于琐碎的可复制类型-对于其他类型,其行为是不确定的。当然,您的副本此刻可能微不足道(假设我已经正确读取了您的代码,因为您正在处理向量的内部缓冲区),但是无需依靠这些细微的细节:您可以使用{{ 1}},它也适用于非平凡类型。
除非我误读了您的程序,否则该程序应执行您的memcpy的操作。除此之外,它适用于没有智能指针的向量。至少对我来说,这更具可读性:
std::copy
P.S。请注意,命名两个变量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);
和profile_vector
非常令人困惑。考虑重命名其中之一。此外,还不清楚profileVector
与复制之间的关系。