现代C ++中的动态数组

问题描述

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

结果是,整个代码都使用进行模板化,其中N_1,N_2是所使用数组的无关长度,导致冗长且占用大量内存的编译,而性能提升可能很少。 / p>

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

  • 在运行时知道数组的大小
  • 这些数组可能包含POD和类似的自定义类
  • 我们在这些数组上循环了很多
  • 这些数组的长度在0到5之间,因此它们很小。
  • 这些数组不会被复制,并在代码末尾销毁
  • C ++ 17

我的第一个想法是在结构中包装一个T模板的unique_ptr ,该模板配备了我们在代码中使用的所有数组方法,以最大程度地减少重构。

我的问题是:

  • 我最初的想法有什么弊端?
  • 有没有更好/更现代的方式来实现这一目标?

解决方法

这些数组的长度在0到5之间

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

一个可能更好的选择是根据使用模式为std::vector自定义分配器。但是这些工作很多。

,

如果执行代码中的分配,则应用程序的启动时间无关紧要,并且向量的最大大小的大小是已知的,这可能比使用std :: vector和reserve的简单解决方案要好。

但是似乎您需要的是一种用于std :: string的小字符串优化(SSO)。如果数据的大小足够小以适合表示字符串的类的大小(减去标记成员的大小),则该技术允许将数据存储在堆栈上。通常,这是一个普遍的问题,以前很多人已经解决过。

有几种选择:

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

选择还取决于您要存储的对象的大小。变体1,2,3可以很好地用于一些POD,但可能需要分配更大的尺寸。变体4可能是最容易实现的,并且可以与POD和类一起使用,但始终需要额外的内存。同样,这类似于带有保留的std :: vector,只是数据将分配在堆栈上,而不是堆上。变体5可能是一个过大的杀伤力,也许您不需要它那么多功能。

,

您在问题中写道,在运行时中知道大小,在这种情况下,我不明白您以前的模板化解决方案是如何工作的,因为应该在编译时知道N1和N2 使其正常工作。

抛开这些,您可以使用固定大小的向量(std :: array),如以下内容所述:C++ vector of fixed size vecors

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...