XCode: ограничение размера стека на многомерном массиве

У меня есть несколько сложных классов в моем проекте XCode (ниже общего примера), и кажется, что я достиг своего рода предела размера данных. Размеры массивов, которые мне нужны, не работают, если я уменьшу размеры массивов, код работает (поэтому ошибок программирования нет), но он слишком мал для того, что я планировал.

Читая интернет, я понял, что это проблема с размером стека, и большинство решений говорят: "Преобразуйте статические массивы в динамические".

но (1) это не так просто с многомерными массивами (некоторые до 5-10 измерений, поскольку они отслеживают несколько независимых переменных и каждая комбинация возможна) и (2) большинство массивов, вложенных в несколько классов, что делает его еще хуже,

Я уже думал о сокращении данных

  • int вместо long с некоторым интеллектуальным переносом...
  • изменить разрешение c (0-100%) с шагом 10% (поэтому [100] уменьшается до [10])

но, с одной стороны, это может поставить под угрозу общие результаты, а с другой - проект все еще находится в начале, поэтому он будет расти в следующем месяце... эта проблема с размером массива рано или поздно вернется...

здесь я обобщил код, показывающий 4-мерный массив (2x 2D). Я думаю, что большинство профессиональных программ используют массивы, которые еще больше. поэтому должен быть способ заставить это работать...

//.h
class StatisticTable
{
public:
    long Array1 [100][50];
    long Array2 [100][50];
    long Array3 [100][140];
};

class Statistic
{
public:
    void WriteStatistic(short Parameter_a, short Parameter_b,
                        short Parameter_c, short Parameter_d);
    short ReadStatistic(short Parameter_a, short Parameter_b,
                        short Parameter_c, short Parameter_d);

private:
    StatisticTable Table[16][8];
};

//.cpp
void WriteStatistic(short a, short b, short c, short d)
{
    for (int i=0; i<d,   i++) {Table[a][b].Array1[c][i]++;}
    for (int i=d; i<50,  i++) {Table[a][b].Array2[c][i]++;}

    //write some more stuff

    return;
}

1 ответ

Решение

Можете ли вы использовать выделение кучи вместо выделения стека?

Как и предполагалось, используя std::unique_ptr:

auto const ptr = std::unique_ptr<StatisticTable>(new StatisticTable()).get(); // heap allocated and deleted automatically when obj goes out of scope

Т.е.

auto obj = new StatisticTable(); // heap allocation, allocate reference to new StatisticTable object on heap
// code
delete obj; // release heap allocated object

против

auto x = StatisticTable() // stack allocation
Другие вопросы по тегам