Получение размера данных C++

80
07 декабря 2021, 11:50

Вопрос. Есть функция. Она берет из памяти данные в определенном количестве (16к слов), обрабатывает и выдает данные данные в другом количестве, сохраняя их в память. Далее мне надо работать с данными, которые в памяти. Вопрос: Как узнать размер данных полученных после функции? Они хранятся в переменной же. Пытался реализовать в следующем стиле:

    conv((long long (*)[h][w])in, (long long (*)[h][w][in_c])B, (long long (*)[y][x])out, add+shift, mul+shift );
    Copy(reinterpret_cast<int*>(out),reinterpret_cast<int*>(output[s_data_shift]), sizeof(out)/64);

Где conv - функция рабочая, а Copy функция копирования данных с аргументами:(source, destination, word(именно в словах!)). Пытаюсь узнать размер выходной переменной out с помощью sizeof() и делю на 64, чтобы получить количество слов. Доходя до этапа определенного далее по программе, все виснет из-за некорректности данных. Правильно ли я определяю размер?

Answer 1

Размер по указателю в памяти - заранее не известен. При обработке данных там где нужен размер выбирается один из нескольких способов.

  1. Создаётся локальная константа либо переменная, туда заносится размер, далее во все методы где участвует размер - добавляется ещё один параметр. Размер передаётся через параметр функции/метода. (например та же функция read FileRead и т п).
  2. Размер передаётся через поле структуры или класса (например как в классе string).
  3. Размер калькуляционный - вычисляется.
  4. Размер передаётся через #define или template

C #define думаю всё понятно #define my_size 10*4*sizeof(long) и пошли.

Теперь как передать размер через template. Для метода это делается например так

template<int N, int M> my_read(void* data) {
   readbytes(myfile, data, sizeof(long)*N*M);
   }

Размер можно вкладывать в аргуметы

template<int N, int M> my_read(long (*data)[N][M]){
   readbytes(myfile, data, sizeof(long)*N*M);
   readbytes(myfile, data, sizeof(*data)); // Даже так
   }

На каждый template как правило создается отдельная реализация кода, поэтому подставлять в template можно только константы. Желательно не делать 100 вариантов-больших template функций, т.к. это приведёт к раздутию кода. Похожие template-конструкции встречал в видеокодеках и кодеках изображения, например в jpegd кодеке.

READ ALSO
Правильно ли реализованы IEnumerator&#39;s для чтения CSV?

Правильно ли реализованы IEnumerator's для чтения CSV?

Я реализовал простенький IEnumerable<CSVLine> для чтения CSV файлов

158
Передача active из листа типа GameObject в лист bool

Передача active из листа типа GameObject в лист bool

Объясните как передать active из листа с типом GameObject в лист типа bool ?

221
Prism.WPF &amp; DryIoc, как регистрировать типы с фабрикой?

Prism.WPF & DryIoc, как регистрировать типы с фабрикой?

Доброго времени сутокВозникла проблема с регистрацией типов в IContainerRegistry с фабрикой

146
Привязки трех вложенных списокв

Привязки трех вложенных списокв

Подскажите пожалуйста как привязать 3 вложенных списка:

161