【问题标题】:Proper way of using large array static member使用大数组静态成员的正确方法
【发布时间】:2021-02-22 21:23:25
【问题描述】:
  • 我希望一个类拥有一个大型数组(至少 100000 个元素)的所有权。

  • 我有一个名为 BaseProduct 的类(成员有 namepricecostprint()...)

  • 我有一个类 BasicProductContainer 将控制 BaseProducts 的数组。

  • 我尝试在我的BasicProductContainer 中拥有一个指向数组的共享指针成员:

private:
    std::shared_ptr<std::array<BaseProduct, NUMBER_OF_PRODUCTS>> m_ptrArrProductContainer;

我想避免在头文件中定义数组,所以我在.cpp的类构造函数中这样做了:

static std::array<BaseProduct, NUMBER_OF_PRODUCTS> ProductContainer;

BasicProductContainer::BasicProductContainer() {
    m_ptrArrProductContainer = std::make_shared<std::array<BaseProduct, NUMBER_OF_PRODUCTS>>(ProductContainer);
}

这“有效”,但我想知道是否有更好的方法?还是更好看的?指向数组的指针是个好主意吗?

【问题讨论】:

  • 1M+ 元素的std::array 相当奇怪。确定不想使用std::vector
  • 我不清楚你到底在追求什么,但看起来BasicProductContainer 的每个实例都会有自己的ProductContainer 副本。 D除非稍后分享进来,否则我看不到shared_ptr的目的。
  • @Justin 数组的大小是固定的,为什么我要使用向量呢?
  • @user4581301 BasicProductContainer 的每个实例都应该有自己的容器。我可以考虑unique_ptr
  • @Ivan std::vector 使用连续内存缓冲区和恒定时间随机访问

标签: c++ arrays static containers stdarray


【解决方案1】:

如果数组不共享,我觉得不应该是shared_ptr。你试过unique_ptr吗?

还有pimpl成语,经常用来避免在头文件中定义数据:

// BasicProductContainer.h
class BasicProductContainerImpl; // forward declare pimpl
class BasicProductContainer {
private:
    std::unique_ptr<BasicProductContainerImpl> m_impl;
}

// BasicProductContainer.cpp
class BasicProductContainerImpl {
public:
  std::array<BaseProduct, NUMBER_OF_PRODUCTS>> arrProductContainer;
}

BasicProductContainer::BasicProductContainer()
  : m_impl(std::make_unique<BasicProductContainerImpl>())
{
    // m_impl->arrProductContainer to access the array
}

请注意,该数组不是static,但您对主帖的评论是每个BasicProductContainer 都应该有自己的容器,这表明您不想要static

【讨论】:

  • 也许在标题中定义大小会让我感到困惑,但是每次我将它包含在.c/.cpp 文件中时,这不会创建数组的副本吗?
  • 没有。该数组仅在实例化 BasicProductContainer 时创建。定义数组大小的位置不会影响实例化数组的位置/时间。如果你有 N 个BasicProductContainer 实例,你将有 N 个数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多