Russian Qt Forum

Qt => Общие вопросы => Тема начата: lex_newton от Июль 24, 2009, 09:34



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


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


Название: 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.

Код
C++ (Qt)
QByteArray arr = QByteArray::fromRawData( (const char*)array, 40000000 * sizeof( double ) );
 


Название: 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++ то знать должны!
Код
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);
 


Название: 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 ]; ( специально побольше, для примера )
...
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 ).


Название: Re: QByteArray и выделенный кусок памяти
Отправлено: lex_newton от Июль 24, 2009, 15:36
Да ;) опечатка ;) этож не реальный кусок проги ;)