我正在尝试对地址执行算术运算。我需要确保它在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被认为是一种禁止的做法。还有另一种方法吗?或者这里保证的规则是例外吗?
答案 0 :(得分:0)
一个棘手的方法可能是指向初始地址 然后在指针上执行+ 1 - &gt;这将根据它指向的变量类型的大小(以字节为单位)自动生成下一个地址。 注意:确保在指针上执行不在地址上的+1(int * initialAddress - &gt;对initialAddress执行操作而不是* initialAddress)
然后你可以在两者之间执行减法,你将拥有字节数。
答案 1 :(得分:0)
我建议你避免分裂 试试这个:
unsigned int pointer_value = (unsigned int) pointer;
if ((pointer_value & 0x3U) == 0U)
{
// Pointer is on 4 byte boundary.
}
当优化级别设置为高时,某些编译器可能只优化除以4并乘以4。我正在使用的嵌入式编译器在除以4而不是右移时将调用除法函数,除非优化设置被调高到高。
答案 2 :(得分:0)
您正在寻找memStartAddress = std::align(4, objSize, memStartAddr, objSize+3);
。标准功能比您需要的更灵活,因此您需要告诉它您最多需要+3地址更改。