Как статически выделить память для массива указателей на структуру - PullRequest
0 голосов
/ 04 мая 2019

Я пытаюсь статически выделить память для массива указателей на структуру, называемую «мини». «Мини» структуры служат способом хранения индекса и данных, поэтому я могу выполнять косвенную сортировку, сортируя указатель на структуру. Когда я объявляю массив, массиву выделяется память для хранения указателей, но сами указатели не выделяют никакой памяти для «мини» структур. Важно, чтобы он был статически распределен, поскольку он является частью алгоритма сортировки, поэтому я стараюсь избегать динамического выделения памяти.

Это объявление mini и массив указателей на mini:

typedef struct {
    long long index;
    string data;
} mini;

static mini* ssn[1010000];

Я могу динамически распределяться следующим образом:

for (int j = 0; j < 1010000; j++){
    ssn[j] = new mini();
}

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

static mini* ssn[1010000] = {{0,""}};

static mini* ssn[1010000]  = {{new mini()}};

Ничего из этого не компилируется успешно. Есть ли способ статически выделить память для каждого указателя в массиве?

1 Ответ

0 голосов
/ 05 мая 2019

У вас есть массив указателей, и вы хотите инициализировать массив (каждый элемент указателя) с другим значением (результат выделения). Невозможно выполнить такую ​​инициализацию в объявлении, кроме как предоставить значение для каждого элемента:

static mini* ssn[4] = {new mini(), new mini(), new mini()};

Каждый элемент, для которого вы не указали значение, будет инициализирован значением по умолчанию 0.

Если вам нужен массив фиксированной длины, лучше использовать std::array. C ++ имеет мощную систему типов, используйте ее. В этом случае инициализация может быть обобщена:

struct Mini {
    int x;
};

template <class Ar, class F, size_t... I>
static auto init(F factory, std::index_sequence<I...>) noexcept {
    return Ar{factory(I)...};
}

using Array = std::array<Mini*, 20>;
static Array ssr(init<Array>([](...) { return new Mini(); }, std::make_index_sequence<20>()));

Это фактически то же самое:

static Array ssr(Array{new Mini(), new Mini(), ...})

Компилятор оптимизирует копию Array. Обратите внимание, что для этого решения требуется c ++ 14, хотя его можно адаптировать для c ++ 11.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...