Название: QByteArray и выделенный кусок памяти Отправлено: 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 создается в сторонней библиотеке, то возможность подобного телодвижения у меня отсутствует... Название: Re: QByteArray и выделенный кусок памяти Отправлено: juvf от Июль 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. Название: Re: QByteArray и выделенный кусок памяти Отправлено: kuzulis от Июль 24, 2009, 09:57 Цитировать Есть выделенный кусок памяти, к примеру, и с ним производится какая нибудь операция: Именно QByteArray нужен? а QVector не сгодится? ведь начальный чассив это double* а не char*double* array = new char[ 40000000 ]; ( специально побольше, для примера ) И необходимо создать QByteArray из этого array. Название: Re: QByteArray и выделенный кусок памяти Отправлено: lex_newton от Июль 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 в новую область памяти. Название: Re: QByteArray и выделенный кусок памяти Отправлено: BRE от Июль 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. Код
Название: Re: QByteArray и выделенный кусок памяти Отправлено: kuzulis от Июль 24, 2009, 10:41 А если просто делать так:
QByteArray ba((char*)array,40000000) Название: Re: QByteArray и выделенный кусок памяти Отправлено: lex_newton от Июль 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 ) ). Или нет? Название: Re: QByteArray и выделенный кусок памяти Отправлено: Rcus от Июль 24, 2009, 11:32 Ну английский вы допустим не знаете, поэтому не читает цитаты из документации. Ну русскому языку не доверяете. Но C++ то знать должны!
Код
Название: Re: QByteArray и выделенный кусок памяти Отправлено: kuzulis от Июль 24, 2009, 11:58 вот только не нужно делать в данном примере 40000000 * sizeof( double )
т.к. изначальный массив - это 40000000 байт , а то получится что что-нить чужое оттяпаете :) Название: Re: QByteArray и выделенный кусок памяти Отправлено: lex_newton от Июль 24, 2009, 12:35 Всем спасибо.
Понял свою ошибку. не прочитал комментарий к перегруженному оператору '='... теперь все сходится и это то, что нужно ;) Цитировать QByteArray & QByteArray::operator= ( const QByteArray & other ) Assigns other to this byte array and returns a reference to this byte array. Название: Re: QByteArray и выделенный кусок памяти Отправлено: BRE от Июль 24, 2009, 14:36 вот только не нужно делать в данном примере 40000000 * sizeof( double ) т.к. изначальный массив - это 40000000 байт , а то получится что что-нить чужое оттяпаете :) double* array = new char[ 40000000 ]; ( специально побольше, для примера ) Все таки изначально был массив double (а char в new был опечаткой), поэтому sizeof( double ) делать нужно!... QByteArray ar; ar.resize( 40000000*sizeof(double) ); double* array = reinterpret_cast<double*>( ar.data() ); ;) P.S. И даже лучше не sizeof( double ), а sizeof( *array ). Название: Re: QByteArray и выделенный кусок памяти Отправлено: lex_newton от Июль 24, 2009, 15:36 Да ;) опечатка ;) этож не реальный кусок проги ;)
|