gpt4 book ai didi

c++ - 将 memcpy 与 vector 的 unique_ptr 结合使用

转载 作者:太空宇宙 更新时间:2023-11-04 12:40:41 26 4
gpt4 key购买 nike

我正在编写一段代码,我需要将指针复制到一个 vector 或它的某些部分 - 定义为:

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

指向另一个 vector 的指针 - 定义为:

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 是否提供了一些隐藏的问题,在某些情况下涉及内存,或者可能涉及缓冲区的一些问题。

附言代码运行良好,我只关心看不到的问题。

最佳答案

首先,几乎没有理由动态分配 vector 。您可以通过使用自动存储大大简化程序:

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

memcpy 的隐藏问题是它只适用于平凡可复制的类型——对于其他类型,行为是未定义的。当然,你的拷贝目前可能是微不足道的(假设我已经正确阅读了你的代码,因为你正在处理 vector 的内部缓冲区),但是没有必要依赖那个微妙的细节:你可以使用 std::copy 相反,它也适用于非平凡类型。

这个程序应该做你的 memcpy 做的,除非我误读了你的程序。除了这适用于没有智能指针的 vector 。这更具可读性,至少对我而言:

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_vectorprofileVector 非常容易混淆。考虑重命名其中之一。此外,尚不清楚 filtered_profile 与复制的关系。

关于c++ - 将 memcpy 与 vector 的 unique_ptr 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54327951/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com