3

我正在尝试对地址执行算术运算。我需要确保它位于 4 字节字边界上。这需要我获取指针的无符号整数表示来执行一些数学运算。我已经这样做了:

//memStartAddr is of type void* (from an external API function)
data32 tempAddr = reinterpret_cast<data32>(memStartAddr);
//adjust pointer to the next word boundary if needed
tempAddr = wordAlign(tempAddr);
//memStartAddress is a class variable of type unsigned char*
memStartAddress = reinterpret_cast<data8*>(tempAddr);
//calculate bytes lost due to above adjustment
data32 delta = (tempAddr - reinterpret_cast<data32>(memStartAddress));
//Take advantage of integer arithmetic to ensure usable size is a multiple
//of 4 bytes. Remainders are lost. Shrinks usable size if necessary.
memSize = ((size - delta) / 4) * 4;

这一切在我的测试中都有效,但是,使用 reinterpret_cast 被认为是一种禁止的做法。还有另一种方法可以做到这一点吗?或者这里的规则是一个例外?

4

3 回答 3

0

一个棘手的方法可能是让指针指向初始地址,然后在指针上执行 + 1 --> 这将根据它指向的变量类型的字节大小自动产生下一个地址。 注意:确保在指针上而不是在地址上执行 +1(int* initialAddress --> 在 initialAddress 上而不是在 *initialAddress 上执行操作)

然后您可以在两者之间进行减法运算,您将获得字节数。

于 2013-11-06T00:56:56.987 回答
0

我建议你避免分裂。
尝试这个:

unsigned int pointer_value = (unsigned int) pointer;
if ((pointer_value & 0x3U) == 0U)
{
    // Pointer is on 4 byte boundary.
}

当优化级别设置为高时,某些编译器可能只优化 4 的除法和 4 的乘法。我使用的嵌入式编译器将在除以 4 时调用除法函数,而不是右移,除非优化设置被调高。

于 2013-11-06T01:51:52.227 回答
0

你正在寻找memStartAddress = std::align(4, objSize, memStartAddr, objSize+3);. 标准函数比你需要的要灵活一点,所以你需要告诉它你最多需要+3的地址变化。

于 2013-11-06T09:25:30.227 回答