Приведение знака без знака к знаку для красно-черного дерева - PullRequest
0 голосов
/ 06 июня 2018

Обзор

Я работаю над упаковкой функциональности Windows Shell с помощью Qt.Проблема, с которой я столкнулся в отношении ABSOLUTE_IDLIST s и хранения данных.Для справки, список идентификаторов Windows в памяти выглядит следующим образом:

//Note that there may be an arbitrary number of cb/abId pairs.
=================================================================
=           =   (cb bytes)  =           =  (cb bytes)   =       =
= USHORT cb =  UCHAR []abID = USHORT cb =  UCHAR []abId = '\0'  =
=================================================================

Я использую абсолютный идентификатор в качестве уникального идентификатора для каждого узла для быстрого поиска.Тип значения - ShellNodePointer, общий указатель на ShellNode, который кэширует данные.Первоначально я подошел к этому с использованием QHash (в основном std::unordored_map), но для этого требуется хеширование битов для каждого поиска (хотя я хранил ключ хеш-функции в ShellNode).

//unsigned int is the hash result, ShellNodePointer is a QSharedPointer to a ShellNode
QHash<unsigned int, ShellNodePointer>

Вместо этого яс учетом подхода красно-черного дерева с использованием QMap.Моя проблема заключается в следующем: самый быстрый способ сравнения двух ключей - сохранить их как QByteArray s, что позволит быстрее выполнять сравнения, а не просто передавать список идентификаторов в виде необработанных данных конструктору QByteArray.

ITEMIDLIST_ABSOLUTE *someIdListPointer = ...;
QByteArray ba(someIdListPointer);

Проблема

К сожалению, QByteArray принимает завершенный нулем const char *, без указания подписи или неподписания.Поскольку я работаю в Windows, по умолчанию используется знаковый символ.

Вопрос

Можно ли привести значение к [signed] char * и игнорировать проблемы переполнения, поскольку каждый ключ отрицательного значения будет переполнен в одном и том жепуть?В частности, будет ли красно-черное дерево по-прежнему работать в обычном режиме, поскольку результирующие данные гарантированно будут одинаковыми при двух отдельных вызовах с одним и тем же ключом?

Примечание. Я знаю, что USHORT cb будет включенов ключе.Это приемлемо, так как это просто дополнительные данные, которые будут сопоставляться с двумя одинаковыми ключами.

Редактировать: уточнено, что abId на самом деле является массивом без нулевого терминатора.

1 Ответ

0 голосов
/ 06 июня 2018

Могу ли я привести к [подписанному] символу * и не обращать внимания на проблемы переполнения, поскольку каждый ключ отрицательного значения будет переполняться одинаково?В частности, будет ли красно-черное дерево по-прежнему работать в обычном режиме, поскольку результирующие данные гарантированно будут одинаковыми в двух отдельных вызовах с одним и тем же ключом?

Да, при приведении типа этого просто интерпретируются байты впамять по-другому и будет согласован для идентичной машины + исполняемый файл / компилятор.Байтовое представление целых чисел со знаком не предписано стандартом, поэтому «значение» (то есть представленное число) может быть не тем, что вы ожидаете, но это не должно иметь значения для дерева RB, которое просто требует полного упорядочения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...