在指针处临时反转数据然后将指针传递给临时反转数据的推荐格式

Recomended formating for temporarily inverting data at pointer and then passing pointer to temporarily inverted data

长话短说,我有一个指向倒置存储的值的指针,所以当我们计算散列以验证数据完整性时,我们需要反转散列中使用的数据。然而,散列函数将指针作为输入。所以我们需要做的是获取我们的指针,取消引用它以获取数据,暂时反转数据,然后传递对反转数据的引用。

我已经写了一些伪代码来说明我最初是如何做到的。

uint32_t hash = 0;
MemoryBlock pMemoryBlock = pAllocator->GetFirstMemoryBlock();
while(nullptr != pMemoryBlock)
{
    uint32_t size = pMemoryBlock->getWordsUsed();
    const uint32_t* pStartAddress = pMemoryBlock->GetStartAddress();
    for (uint32_t i = 0; i < size; i++)
    {
        if (isDiagnostics)
        {
            uint32_t inverted_data = ~(pStartAddress[i]);
            hash = Algorithim::Calculate(&inverted_data, hash);
        }
        else
        {
            hash = Algorithim::Calculate(&pStartAddress[i], hash);
        }
    }
    pMemoryBlock->GetNextMemoryBlock();
}
return hash;

但是我的代码审查同事希望我避免使用 temp 变量并将其更改为。

uint32_t hash = 0;
MemoryBlock pMemoryBlock = pAllocator->GetFirstMemoryBlock();
while(nullptr != pMemoryBlock)
{
    uint32_t size = pMemoryBlock->getWordsUsed();
    const uint32_t* pStartAddress = pMemoryBlock->GetStartAddress();
    for (uint32_t i = 0; i < size; i++)
    {
        if (isDiagnostics)
        {
            hash = Algorithim::Calculate(&~pStartAddress[i], hash);
        }
        else
        {
            hash = Algorithim::Calculate(&pStartAddress[i], hash);
        }
    }
    pMemoryBlock->GetNextMemoryBlock();
}
return hash;

我想知道是否有真正的理由避免使用临时变量。如果它甚至可以取消引用指针,请对数据执行运算符,然后传递对它的引用而不将值分配给任何东西(因为我很确定它不会)。如果有比第一个例子更好的方法来做到这一点。

您需要临时变量。这个表达式:

hash = Algorithim::Calculate(&~pStartAddress[i], hash);

无效,因为 ~ 运算符的结果不是左值,而 & 运算符需要左值。

附带说明一下,您可以通过在两种情况下使用临时值来减少代码中的重复:

    uint32_t data = isDiagnostics ? ~pStartAddress[i] : pStartAddress[i];
    hash = Algorithim::Calculate(&data, hash);