constexpr array vs deque,内存利用率
constexpr array vs deque, memory utilization
我需要在我的代码中存储大约 30 个整数的预先知道的大小,我已经做到了
constexpr std::array<size_t, 30> MAPPING{1, 2, 3, ...};
如果我没记错的话,上面的内容会在编译时进行评估,但它也会占用一个大小为 30 个整数的连续内存块?
如果是,是否值得使用 std::deque 代替
const std::deque<int> MAPPING{1, 2, 3, ...};
这样,使用双端队列,我们就不会使用单个大的顺序内存块,它可能会使用一堆碎片块,因此即使内存碎片化也能正常工作?
如有遗漏请告知,谢谢
不值得在这里使用std::deque
。
它还会占用一个大小为 30 个整数的连续内存块吗?
是的,它将占用堆栈中大小为 30 个整数的单个连续内存块
这样,对于双端队列,我们不会使用单个大的顺序内存块,它可能会使用一堆碎片块,因此即使内存碎片化也能正常工作?
它是 implementation-dependent,对于 30 个整数,它们可能会被分成几个小块,也可能不会,但它会使用 heap 内存,因此有运行时开销:
As opposed to std::vector, the elements of a deque are not stored
contiguously: typical implementations use a sequence of individually
allocated fixed-size arrays, with additional bookkeeping, which means
indexed access to deque must perform two pointers dereferences,
compared to vector's indexed access which performs only one.
根据@Homer512的评论,我们在使用堆的时候也需要注意内存碎片,可能会造成内存浪费,无法避免。
我需要在我的代码中存储大约 30 个整数的预先知道的大小,我已经做到了
constexpr std::array<size_t, 30> MAPPING{1, 2, 3, ...};
如果我没记错的话,上面的内容会在编译时进行评估,但它也会占用一个大小为 30 个整数的连续内存块?
如果是,是否值得使用 std::deque 代替
const std::deque<int> MAPPING{1, 2, 3, ...};
这样,使用双端队列,我们就不会使用单个大的顺序内存块,它可能会使用一堆碎片块,因此即使内存碎片化也能正常工作?
如有遗漏请告知,谢谢
不值得在这里使用std::deque
。
它还会占用一个大小为 30 个整数的连续内存块吗?
是的,它将占用堆栈中大小为 30 个整数的单个连续内存块
这样,对于双端队列,我们不会使用单个大的顺序内存块,它可能会使用一堆碎片块,因此即使内存碎片化也能正常工作?
它是 implementation-dependent,对于 30 个整数,它们可能会被分成几个小块,也可能不会,但它会使用 heap 内存,因此有运行时开销:
As opposed to std::vector, the elements of a deque are not stored contiguously: typical implementations use a sequence of individually allocated fixed-size arrays, with additional bookkeeping, which means indexed access to deque must perform two pointers dereferences, compared to vector's indexed access which performs only one.
根据@Homer512的评论,我们在使用堆的时候也需要注意内存碎片,可能会造成内存浪费,无法避免。