Russian Qt Forum
Сентябрь 30, 2024, 08:19 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QByteArray и выделенный кусок памяти  (Прочитано 9166 раз)
lex_newton
Гость
« : Июль 24, 2009, 09:34 »

Есть выделенный кусок памяти, к примеру, и с ним производится какая нибудь операция:
double* array = new char[ 40000000 ]; ( специально побольше, для примера )


И необходимо создать QByteArray из этого array.
Собственно, проблема в том, что QByteArray имеет методы только QByteArray(const char* data, int len ), setData(const char* data, int len ),
соотвественно, для получение желаемого результата QByteArray самолично выделить такой же кусок памяти.
НО array больше в программе нигде не будет нужен. Таким образом, мы впустую тратим процессорное время и память.
Можно ли как-то заставить QByteArray принять array без копирования его в новую область памяти?

Я знаю, что можно поступить следующим образом:
QByteArray ar;
ar.resize( 40000000*sizeof(double) );
double* array = reinterpret_cast<double*>( ar.data() );

Но это лишь в том случае, если я управляю выделением памяти для array. Если же array создается в сторонней библиотеке,
то возможность подобного телодвижения у меня отсутствует...
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« Ответ #1 : Июль 24, 2009, 09:51 »

А такая штука тебе не поможет?
Цитировать
QByteArray QByteArray::fromRawData ( const char * data, int size )   [static]

Constructs a QByteArray that uses the first size characters in the array data. The bytes in data are not copied.



Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #2 : Июль 24, 2009, 09:57 »

Цитировать
Есть выделенный кусок памяти, к примеру, и с ним производится какая нибудь операция:
double* array = new char[ 40000000 ]; ( специально побольше, для примера )


И необходимо создать QByteArray из этого array.
Именно QByteArray нужен? а QVector не сгодится? ведь начальный чассив это double* а не char*
Записан

ArchLinux x86_64 / Win10 64 bit
lex_newton
Гость
« Ответ #3 : Июль 24, 2009, 10:27 »

А такая штука тебе не поможет?
Цитировать
QByteArray QByteArray::fromRawData ( const char * data, int size )   [static]

Constructs a QByteArray that uses the first size characters in the array data. The bytes in data are not copied.

Нет. В данном случае QByteArray так же создаст копию array, а не возьмет за основу уже созданный array.

Именно QByteArray нужен? а QVector не сгодится? ведь начальный чассив это double* а не char*
Вообще, да, нужен именно QByteArray, т.к. для создания универсального доступа к сэмплам
(более конкретно - это волновые формы в разных форматах, int8,int16,int32,double)
QVector, кстати, тоже производит копирование array в новую область памяти.
Записан
BRE
Гость
« Ответ #4 : Июль 24, 2009, 10:40 »

Нет. В данном случае QByteArray так же создаст копию array, а не возьмет за основу уже созданный array.
Ты уверен?

Цитировать
Constructs a QByteArray that uses the first size characters in the array data. The bytes in data are not copied.

Код
C++ (Qt)
QByteArray arr = QByteArray::fromRawData( (const char*)array, 40000000 * sizeof( double ) );
 
« Последнее редактирование: Июль 24, 2009, 10:51 от BRE » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #5 : Июль 24, 2009, 10:41 »

А если просто делать так:

QByteArray ba((char*)array,40000000)
« Последнее редактирование: Июль 24, 2009, 10:46 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
lex_newton
Гость
« Ответ #6 : Июль 24, 2009, 11:28 »

BRE: Насколько я понимаю, это несколько не то, что мне нужно. Либо я не правильно понял.
В данном случае QByteArray::fromRawData() является всего лишь "устройством" предоставляющим интерфейс для доступа к
raw данным(array).
+ QByteArray arr = QByteArray::fromRawData( (const char*)array, 40000000 * sizeof( double ) ); - эта операция копирует QByteArray, и по сути
аналогична QByteArray arr( (const char*)array, 40000000 * sizeof( double ) ).
Или нет?
Записан
Rcus
Гость
« Ответ #7 : Июль 24, 2009, 11:32 »

Ну английский вы допустим не знаете, поэтому не читает цитаты из документации. Ну русскому языку не доверяете. Но C++ то знать должны!
Код
C++ (Qt)
QByteArray QByteArray::fromRawData(const char *data, int size)
{
   Data *x = static_cast<Data *>(qMalloc(sizeof(Data)));
   if (data) {
       x->data = const_cast<char *>(data);
   } else {
       x->data = x->array;
       size = 0;
   }
   x->ref = 1;
   x->alloc = x->size = size;
   *x->array = '\0';
   return QByteArray(x, 0, 0);
 
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #8 : Июль 24, 2009, 11:58 »

вот только не нужно делать в данном примере 40000000 * sizeof( double )

т.к. изначальный массив - это 40000000 байт , а то получится что что-нить чужое оттяпаете Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
lex_newton
Гость
« Ответ #9 : Июль 24, 2009, 12:35 »

Всем спасибо.
Понял свою ошибку. не прочитал комментарий к перегруженному оператору '='...
теперь все сходится и это то, что нужно Подмигивающий

Цитировать
QByteArray & QByteArray::operator= ( const QByteArray & other )
Assigns other to this byte array and returns a reference to this byte array.
Записан
BRE
Гость
« Ответ #10 : Июль 24, 2009, 14:36 »

вот только не нужно делать в данном примере 40000000 * sizeof( double )

т.к. изначальный массив - это 40000000 байт , а то получится что что-нить чужое оттяпаете Улыбающийся

double* array = new char[ 40000000 ]; ( специально побольше, для примера )
...
QByteArray ar;
ar.resize( 40000000*sizeof(double) );
double* array = reinterpret_cast<double*>( ar.data() );
Все таки изначально был массив double (а char в new был опечаткой), поэтому sizeof( double ) делать нужно!
 Подмигивающий

P.S. И даже лучше не sizeof( double ), а sizeof( *array ).
« Последнее редактирование: Июль 24, 2009, 16:36 от BRE » Записан
lex_newton
Гость
« Ответ #11 : Июль 24, 2009, 15:36 »

Да Подмигивающий опечатка Подмигивающий этож не реальный кусок проги Подмигивающий
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.091 секунд. Запросов: 23.