Приведение возвращаемого значения выделения памяти к массиву TYPE - PullRequest
0 голосов
/ 15 января 2020

Попытка сделать следующее в VisualStudio безуспешно. В основном я получил тип TypeA и хочу создать массив TypeA, скажем, TypeA array[10];

Но я хочу, чтобы массив был в куче, а не в стеке, потому что он будет Огромный (например, 0x200000) или что-то в этом роде.

Итак, что я пытаюсь сделать с кодом, примерно так:

struct TypeA {
    UINT64 a;
    UINT64 b;
    UINT64 c;
    UINT64 d;
};

TypeA array[0x10000] = (TypeA[0x10000])malloc(sizeof(TypeA)*0x10000);

Ответы [ 4 ]

3 голосов
/ 15 января 2020

На основании ваших комментариев мне кажется, что вы хотите что-то вроде

template<typename T, std::size_t N>
struct array_wrapper {
    T array[N];
    // might extend with the remaining `std::array` interface
};

//...

auto array = std::make_unique<array_wrapper<TypeA, 0x10000>>();

some_library_function(array->array);

Таким образом some_library_function увидит встроенный массив типа TypeA и длины 0x10000, но с Dynami c продолжительность хранения.


Обратите внимание, что я не использую std::array, потому что я не уверен, что существует гарантированный законный способ получить ссылку на базовый массив (а не его первый элемент), даже с reinterpret_cast. По крайней мере, я уверен, что не было бы, если бы TypeA не был типом стандартного макета.


Также обратите внимание, что std::make_unique будет инициализировать массив массивом, что означает, что он будет равен нулю все элементы. Если у вас есть какая-то конкретная c причина производительности, чтобы избежать этого, вы можете использовать std::make_unique_default_init вместо этого в C ++ 20 или (менее предпочтительно) до этого:

using array_type = array_wrapper<TypeA, 0x10000>;
auto array = std::unique_ptr<array_type>(new array_type);
3 голосов
/ 15 января 2020

Как и для всех динамических c массивов, используйте std::vector.

std::vector<TypeA> array(0x10000);
0 голосов
/ 15 января 2020

Вы не можете иметь массив. TypeA array[0x10000] объявляет массив 0x10000 элементов в стеке. Конец. Полный стоп.

Однако вы можете иметь указатель на начало массива в стеке. Обычно это делается:

TypeA *array = (TypeA*)malloc(sizeof(TypeA)*0x10000);

Поскольку это C ++, а не C, вам следует использовать new, который существует для этой цели. Обратите внимание, что если бы у TypeA был конструктор, malloc не вызвал бы его, а new.

TypeA *array = new TypeA[0x10000];

Не забудьте освободить массив с помощью free (для malloc ) или delete [] (для new [])

Вы также можете выделить std::array: (это считается как один объект, поэтому удалите его с помощью delete, а не delete[])

std::array<TypeA, 0x10000> *array = new std::array<TypeA, 0x10000>;
0 голосов
/ 15 января 2020

Попробуйте

struct TypeA* array = malloc(0x10000 * sizeof(struct TypeA));

Редактировать: Извините, это C

...