You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何无需复制内存拼接两个std::shared_ptr?

如何无需内存复制拼接两个std::shared_ptr<float[]>

我想了解是否存在一种无需复制内存即可将两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 14:36:34