ads*_*px5 5 c++ compression 64-bit
我刚刚下载了LZ4-HC压缩源并检查它是否具有64位兼容性.
我收到的警告很少"从'__64'转换为'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)
Run Code Online (Sandbox Code Playgroud)
在32位上发生了什么 - 我们从指针中减去const int并存储到另一个指针 - 足够安全.
现在64:我认为在64上减去两个指针并将它们保存到U32根本不安全!
我的理解是LZ4只有在保证"p"和"base"相距不远的情况下才是64位兼容的......现在我必须深入研究逻辑以检查它.
我错过了什么吗?有没有人检查过这个库,因为它声称是完整的64位兼容性?图书馆代码还有其他任何已知问题吗?
LZ4 应该是 64 位兼容的。它已经经过多次测试。
LZ4-HC 稍微复杂一些,可能还剩下一些编译器警告。请随时在问题列表上通知他们: http: //code.google.com/p/lz4/issues/list
2 个指针相减应该是 size_t 类型。size_t 在 64 位 CPU 上是 64 位。因此,将结果转换为 32 位可能会产生溢出问题。
然而这不太可能。LZ4 在 64 KB 窗口上工作。这意味着,任何超过 64KB 的引用都会被忽略。对于很长范围的引用来说,它需要正好 4GB + 几 KB。此外,由于列出了引用,因此使用相同散列的 < 64KB 和 > 4GB 之间的引用必须绝对为零。这也是极不可能的。
即使这样,如果可以故意伪造这种情况,最终的结果是压缩机将被“暗示”到不匹配的位置。并会在比较操作时丢弃它。
因此,唯一的缺点是在无用的比较中可能会丢失一些 CPU 周期。相当公平。
尽管如此,只要“几乎免费”,最好删除“编译器警告”。几乎免费被转化为:没有性能损失,并且对代码复杂性的影响可以忽略不计。