Как правило, вы можете предполагать, что распределение стека будет быстрее.Просто помните, что у стека ограниченная емкость, и чрезмерное использование больших массивов, выделенных стеком, может привести, подождите его ... переполнение стека!
В любом случае, ваш вопрос верен, но решения, которые я виделдалеко крайне ограничены.Дело в том, что вы можете легко создать тип утилиты, который будет действовать как треугольная матрица, и тогда это зависит от конкретного случая использования, будете ли вы хранить его в стеке или куче.Наблюдайте:
namespace meta
{
template <size_t N>
struct sum
{
static const int value = (N + 1) * N / 2;
};
}
template <size_t Size>
struct MultiArray
{
// actual buffer
int numbers[ meta::sum<Size>::value ];
// run-time indexing
int* getArray(size_t dimensions)
{
// get sum of (dimensions-1)
size_t index = (dimensions * (dimensions-1)) >> 1;
return &numbers[index];
}
// compile-time indexing
template <size_t dimensions>
int* getArray()
{
size_t index = meta::sum<dimensions - 1>::value ;
return &numbers[ index ];
}
int* operator[](size_t index)
{
return getArray(index);
}
};
Теперь вам решать, где его хранить.
MultiArray<1000> storedOnStack;
MultiArray<1000>* storedOnHeap = new MultiArray<1000>();
Для доступа к внутренним массивам вам нужны аксессоры:
int* runTimeResolvedArray = storedOnStack.getArray(10);
int* compileTimeResolvedArray = storedOnStack.getArray<10>();
int* runTimeResolvedArray2 = storedOnStack[10];
storedOnStack[10][0] = 666;
Надеюсь, это поможет!
РЕДАКТИРОВАТЬ: Я также должен сказать, что мне не нравится термин "распределение стека".Это вводит в заблуждение.Распределение стека - это, по сути, просто увеличение регистра указателя стека.Таким образом, если вы «выделите» 100 байтов в стеке, указатель будет увеличен на 100 байтов.Но если вы выделите 100 байт в куче, тогда это будет сложно - текущий распределитель должен найти подходящее пустое пространство памяти, обновить карту выделения и так далее, и так далее.
Если это однократное распределение - продолжайте и сделайте это в куче, накладные расходы динамического выделения не будут заметны.Но если делать это много раз в секунду, тогда выбирайте распределение стека.Кроме того, массивы стека могут быть потенциально более быстрыми для доступа, потому что содержимое стека, скорее всего, будет в кеше.Но очевидно, что действительно огромные массивы не поместятся в кеш.Итак, ответчик: профиль .