处理低级字节操作时reinterpret_cast是否错误?

mat*_*usa 9 c++ casting reinterpret-cast c++11

我正在编写一个websocket服务器,我必须处理需要取消屏蔽的屏蔽数据.

掩码是unsigned char [4],数据也是unsigned char*缓冲区.

我不希望逐字节XOR,我更喜欢一次XOR 4字节.

uint32_t * const end = reinterpret_cast<uint32_t *>(data_+length);
for(uint32_t *i = reinterpret_cast<uint32_t *>(data_); i != end; ++i) {
    *i ^= mask_;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下使用reinterpret_cast有什么问题吗?

替代方案是以下代码,它不是那么明确而且不够快:

uint64_t j = 0;
uint8_t *end = data_+length;
for(uint8_t *i = data_; i != end; ++i,++j) {
    *i ^= mask_[j % 4];
}
Run Code Online (Sandbox Code Playgroud)

我很喜欢替代品,包括那些依赖于c ++ 11功能的产品.

Die*_*ühl 8

发布的方法存在以下几个潜在问题:

  1. 在某些系统上,大于char需要正确对齐的类型的对象可以访问.典型的要求uint32_t是对象与可被4整除的地址对齐.
  2. 如果length / sizeof(uint32_t) != 0循环可能永远不会终止.
  3. 根据系统的endianess mask需要包含不同的值.如果mask*reinterpret_cast<uint32_t>(char_mask)合适的数组生成,则不应该是数组.

如果这些问题得到解决,reinterpret_cast<...>(...)可以在您拥有的情况下使用.重新解释指针的含义是此操作存在的原因之一,有时需要它.我会创建一个合适的测试用例来验证它是否正常工作,以避免在将代码移植到不同平台时不得不解决问题.

我个人会采用不同的方法,直到分析显示它太慢:

char* it(data);
if (4 < length) {
    for (char* end(data + length - 4); it < end; it += 4) {
        it[0] ^= mask_[0];
        it[1] ^= mask_[1];
        it[2] ^= mask_[2];
        it[3] ^= mask_[3];
    }
}
it != data + length && *it++ ^= mask_[0];
it != data + length && *it++ ^= mask_[1];
it != data + length && *it++ ^= mask_[2];
it != data + length && *it++ ^= mask_[3];
Run Code Online (Sandbox Code Playgroud)

我肯定在软件中使用了许多类似的方法,这些方法意味着更快,并且没有发现它们是一个值得注意的性能问题.