Совместим ли исходный код для сжатия LZ4 с 64-разрядной версией?

Я только что скачал исходники для сжатия LZ4-HC и проверил его на 64-битную совместимость.

Я получаю несколько предупреждений «преобразование из ‘__int64’ в ‘unsigned int’, возможная потеря данных»

Когда я продолжал копать, я заметил макрос ADD_HASH (p). Последняя часть этого макроса

HashTable[HASH_VALUE(p)] = (p) - base;

p - const BYTE*
base - const BYTE* const for 64-bit.   (const int b - for 32-bit)
HTYPE HashTable[];
HTYPE is U32 for 64-bit platform       (const BYTE* - for 32-bit)

То, что происходит в 32-битном — мы вычитаем const int из указателя и сохраняем в другом указателе — достаточно безопасно.

Сейчас 64:
Мне кажется, что вычитать два указателя на 64 и сохранить их в U32 вовсе не безопасно!

Мое понимание того, что LZ4 совместим с 64-битной версией, только если гарантировано, что «p» и «base» не далеки друг от друга … и теперь мне нужно углубиться в логику, чтобы проверить это.

Я что-то пропустил? Кто-нибудь проверял эту библиотеку на полную 64-битную совместимость, как она утверждала? Любые другие проблемы с кодом библиотеки?

5

Решение

Предполагается, что LZ4 совместим с 64 битами. Это было проверено много раз уже.

LZ4-HC немного сложнее, и, возможно, остались некоторые предупреждения компилятора.
Не стесняйтесь уведомлять их в списке вопросов: http://code.google.com/p/lz4/issues/list

Предполагается, что вычитание из 2 указателей имеет тип size_t.
size_t — 64 бит на 64 битном процессоре.
Поэтому приведение результата к 32 битам может создать проблему переполнения.

Это, однако, маловероятно.
LZ4 работает на 64 КБ окне. Это означает, что любая ссылка за пределами 64 КБ игнорируется. Чтобы ссылка на очень большой диапазон стала проблемой, она должна быть ровно 4 ГБ + несколько КБ.
Более того, поскольку ссылки перечислены, необходимо, чтобы между < 64 КБ и> 4 ГБ, используя тот же хэш. Это также крайне маловероятно.

Даже тогда, если такой случай может быть умышленно подделан, конечный эффект заключается в том, что компрессор будет «намекает» на положение, которое не совпадает. И сбросит его при операции сравнения.

Таким образом, единственным недостатком является риск потерять несколько циклов ЦП при бесполезном сравнении. Вполне справедливо.

Тем не менее, всегда лучше удалять «предупреждения компилятора», когда они «почти бесплатны». Практически бесплатно переводится на: без потери производительности и незначительного влияния на сложность кода.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector