首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >现代C++中的动态数组

现代C++中的动态数组
EN

Stack Overflow用户
提问于 2020-08-11 05:41:10
回答 3查看 889关注 0票数 1

对于面向性能的库,我们目前使用std::数组,其长度取决于问题。

因此,整个代码被模板化为,其中N_1、N_2是正在使用的数组的无关长度,这导致了长时间和内存密集型的编译,而性能收益可能很小。

考虑到以下情况,我们如何以最现代的方式替换这些数组:

  • 数组的大小在运行时已知。
  • 这些数组可能包含相同的荚和自定义类。
  • 我们经常遍历这些数组。
  • 这些数组的长度在0到5之间,所以它们比较小。
  • 这些数组不会在代码末尾被复制和销毁
  • C++17

我的第一个想法是将unique_ptr封装在一个结构中,使用T模板,并配备我们在代码中使用的所有数组方法,以最小化重构。

我的问题是:

  • 我最初想法的缺点是什么?
  • 是否有更好/更现代的方法来实现这一目标?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-08-11 07:27:52

如果您的代码中的分配是执行分配的,那么应用程序的启动时间并不重要,并且已知向量最大大小的大小,这可能比使用std::vector和备用的简单解决方案更好。

但是,您需要的似乎是一种用于std::string的小字符串优化(SSO)。该技术允许在堆栈中存储数据,如果数据的大小足够适合类的大小(减去标记成员的大小),表示字符串。一般来说,这是一个常见的问题,以前很多人都讨论过这个问题。

有几种选择:

  1. 如果您的类型类似于char,请使用std::basic_string。
  2. 依赖项使用boost 向量
  3. 依赖关系使用愚蠢的向量
  4. 根据std::数组编写您自己的实现(但不要从std::array派生,只需在类中使用它),但要使它保留更多的内存。
  5. 用SSO编写您自己的向量。

选择还取决于要存储的对象的大小。变体1,2,3可以很好地处理一些豆荚,但可能需要为更大的尺寸分配。变体4可能是最容易实现的,它将与豆荚和类一样工作,但它总是需要额外的内存。这就像一个带有保留的std::vector,除了数据将被分配到堆栈上,而不是堆上。变体5可能是过火的,你可能不需要它有那么多用途。

票数 1
EN

Stack Overflow用户

发布于 2020-08-11 05:55:30

这些数组的长度介于0到5之间。

一个好的解决方案是对每个数组使用长度为5的自动数组。与动态分配开销相比,0-4整数可能丢失的内存可能微不足道。

一个可能更好的选择可能是std::vector的自定义分配器,这取决于使用模式。但这是很多工作。

票数 1
EN

Stack Overflow用户

发布于 2020-08-11 05:54:51

您在问题中写道,尺寸在运行时中是已知的,在这种情况下,我不理解以前的模板化解决方案是如何工作的,因为N1和N2应该在编译时中知道才能工作。

撇开这一点不说,您可以使用固定大小的向量(std::array),如:固定尺寸矢量的C++向量中所述。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63352132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档