crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

История благодарностей участнику loz ::: Спасибо сказали: 2 раз(а)
Дата поста: В теме: За сообщение: Спасибо сказали:
11.4.2010, 8:56 Секреты и интересные возможности Qt
Думаю что в данной теме необходимо упомянуть об интересной возможности Qt - функции прямого копировани участков памяти :
void *qMemCopy(void* dest, const void* src, size_t n)

Данная функция копирует n байт из src в dest. Разумеется, вся ответственность за проверку размеров лежит на программисте.

Для примера использования могу показать приведение типов, обычными способами которое производится довольно трудоемко, а именно - мне надо было работать со строками в их битовом представлении. В Qt есть два класса - QString и QBitArray, возможности нормальной конвертации данных между ними я найти не смог, а требование к производительности кода было достаточно высоко, пришлось сделать так:
inline QString bitsToString(QBitArray& arr) {
        QString r;
        r.resize(arr.size() / 16);   // длина массива должна быть точно кратна размеру символа в UTF-16, 16 битам
        qMemCopy(r.data_ptr()->data, arr.data_ptr()->data+1, r.length()*2);   // т.к. 1 символ = 2 байта
        return(r);
};

inline QBitArray stringToBits(const QString& str) {
        QBitArray r(str.length()*16);    // 16 бит в символе
        qMemCopy(r.data_ptr()->data+1, str.constData(), str.length()*2);
        return (r);
}


И здесь еще есть инетересная особенность класса QBitArray, как вы заметили для обращения к данным в нем мы прибавляли к указателю 1, т.е. данны идут со второго байта, но почему?
А потому, что биты из QBitArray хранятся как реальные биты, но т.к. в памяти минимальная еденица хранения - байт, то что же делать с массивом например из 9 бит?
Так вот в этом первом байте как раз хранится количество используемых бит последнего байта массива. Все просто =)
Litkevich Yuriy, molchanoviv,

RSS Текстовая версия Сейчас: 23.4.2024, 21:45