如何无需复制内存拼接两个std::shared_ptr?
我想了解是否存在一种无需复制内存即可将两个
std::shared_ptr<float[]>拼接为一个的方法。我目前的拼接方式如下:int main(){ std::shared_ptr<float[]> _a = std::make_unique<float[]>(10); std::shared_ptr<float[]> _b = std::make_unique<float[]>(20); std::shared_ptr<float[]> concat = std::make_unique<float[]>(30); std::copy(_a.get(), _a.get() + 10, concat.get()); std::copy(_b.get(), _b.get() + 20, concat.get() + 10); return 0; }是否可以让一个
std::shared_ptr指向这两个指针的特定范围?我知道可以通过以下自定义包装结构体实现:struct concat{ std::shared_ptr<float[]> a; std::shared_ptr<float[]> b; size_t sa, sb; concat(std::shared_ptr<float[]> _a, std::shared_ptr<float[]> _b, size_t _sa, size_t _sb) :a(_a), b(_b), sa(_sa), sb(_sb) {} float& operator[](const size_t& index){ return (index > sa ? b[index - sa] : a[index]); } };请问是否有更内置的方式来实现这一操作?
核心结论
没有C++标准库内置的直接方式,能让单个std::shared_ptr<float[]>指向两个独立内存块并实现拼接式访问。
原因说明
std::shared_ptr的设计核心是管理单一连续内存块的生命周期,它的引用计数、删除器等机制都是围绕单个内存区域构建的。不存在原生的shared_ptr变种可以同时关联两块不连续的内存,也无法通过标准接口让它返回一个能跨两块内存的"虚拟连续"指针——因为物理上这两块内存本就不连续,硬件层面无法通过指针偏移直接访问另一块区域。
替代方案优化
你自己实现的concat结构体是这类场景下的合理选择,可补充一些细节让接口更贴近标准容器:
struct ConcatView { std::shared_ptr<float[]> a; std::shared_ptr<float[]> b; size_t sa; size_t sb; ConcatView(std::shared_ptr<float[]> _a, std::shared_ptr<float[]> _b, size_t _sa, size_t _sb) : a(std::move(_a)), b(std::move(_b)), sa(_sa), sb(_sb) {} float& operator[](size_t index) { if (index >= sa + sb) { throw std::out_of_range("Index out of bounds"); } return index < sa ? a[index] : b[index - sa]; } const float& operator[](size_t index) const { if (index >= sa + sb) { throw std::out_of_range("Index out of bounds"); } return index < sa ? a[index] : b[index - sa]; } size_t size() const { return sa + sb; } };
如果需要兼容更多标准容器操作,也可以考虑使用第三方库(如Boost的join视图),但仅依赖标准库时,自定义视图结构体是最直接的解决方案。
内容的提问来源于stack exchange,提问作者Sam Moldenha
相关产品推荐
相关产品推荐

