CArray 和内存预分配
CArray and memory pre-allocation
我正在使用 MFC 项目中的代码,该项目使用 CArray class 来处理动态数组。它是这样工作的:
CArray<CUSTOM_STRUCT> arr;
while(some_criteria)
{
CUSTOM_STRUCT cs;
add.add(cs);
}
这种方法可行,但在向动态数组添加大量内容时变得非常慢。所以我很好奇,有没有办法在我开始调用 add() 方法之前在 CArray 中预分配内存?
不过有一点需要注意。在我进入我的 while() 循环之前,我只能估计数组中元素的大概数量。
PS。除了 CArray,我不能使用任何其他数组。
PS2。由于此项目的复杂性,我更愿意通过 add() 方法向数组添加内容。
真的,真的考虑换一个 std::vector
。出乎意料的简单。
这是尝试让 CArray
遵循类似 std::vector
的增长政策,而不是每次都增长 1:
CArray<CUSTOM_STRUCT> arr;
while(some_criteria) {
CUSTOM_STRUCT cs;
arr.SetSize( arr.GetSize(), 1 + arr.GetSize()/2 );
arr.add(cs);
}
当我运行遇到这个问题时,我用std::vector
替换了CArray
,所以我没有测试上面的内容。阅读文档,它应该工作。测试它,看看你是否获得了巨大的性能提升(它应该从 O(n^2) 下降到 O(n) 摊销)。
使用CArray::SetSize()
方法预分配内存。
请注意,如果内存是预分配的,您应该使用 CArray::operator[]
而不是 CArray::Add
方法。
我正在使用 MFC 项目中的代码,该项目使用 CArray class 来处理动态数组。它是这样工作的:
CArray<CUSTOM_STRUCT> arr;
while(some_criteria)
{
CUSTOM_STRUCT cs;
add.add(cs);
}
这种方法可行,但在向动态数组添加大量内容时变得非常慢。所以我很好奇,有没有办法在我开始调用 add() 方法之前在 CArray 中预分配内存?
不过有一点需要注意。在我进入我的 while() 循环之前,我只能估计数组中元素的大概数量。
PS。除了 CArray,我不能使用任何其他数组。
PS2。由于此项目的复杂性,我更愿意通过 add() 方法向数组添加内容。
真的,真的考虑换一个 std::vector
。出乎意料的简单。
这是尝试让 CArray
遵循类似 std::vector
的增长政策,而不是每次都增长 1:
CArray<CUSTOM_STRUCT> arr;
while(some_criteria) {
CUSTOM_STRUCT cs;
arr.SetSize( arr.GetSize(), 1 + arr.GetSize()/2 );
arr.add(cs);
}
当我运行遇到这个问题时,我用std::vector
替换了CArray
,所以我没有测试上面的内容。阅读文档,它应该工作。测试它,看看你是否获得了巨大的性能提升(它应该从 O(n^2) 下降到 O(n) 摊销)。
使用CArray::SetSize()
方法预分配内存。
请注意,如果内存是预分配的,您应该使用 CArray::operator[]
而不是 CArray::Add
方法。