在指针处临时反转数据然后将指针传递给临时反转数据的推荐格式
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);
长话短说,我有一个指向倒置存储的值的指针,所以当我们计算散列以验证数据完整性时,我们需要反转散列中使用的数据。然而,散列函数将指针作为输入。所以我们需要做的是获取我们的指针,取消引用它以获取数据,暂时反转数据,然后传递对反转数据的引用。
我已经写了一些伪代码来说明我最初是如何做到的。
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);