始终以4个字节的倍数访问奇数大小的数据结构是否安全?

时间:2015-06-05 19:50:34

标签: delphi memory-alignment

如果{ "type":"record", "namespace":"com.mycompany", "name":"JPEG", "fields":[ { "name":"TheBytes", "type":"bytes" }, ] } 不是4的倍数。访问剩余的几个字节可能很尴尬 我想通过读取4字节变量中剩余的1,2或3个字节来优化它,然后屏蔽掉我不需要的字节。

这不应该给出例外,因为块应该在dword(或更大)对齐的块中分配。

让我举个例子:

SizeOf(datastructure)

这样安全还是会让我遇到麻烦?

1 个答案:

答案 0 :(得分:4)

这是安全的,当且仅当它有效读取数据末尾超过4的倍数。如果字节数组保存在整数数组中,那么你没事。如果它实际上保存在字节数组中,那么你可能正在读取缓冲区的末尾。

我的意思是,虽然你的函数接受PInteger,但为了方便起见,这可能是为了解决数组问题。如果函数的调用者在调用站点将PByte强制转换为PInteger,那么至少可以从数组的末尾读取并可能遇到运行时内存故障。< / p>

你提到优化的愿望正在推动这一点。我不确定哈希计算的最后一步是否需要优化。循环是您承担成本的地方。我怀疑你使用Move执行一个乱码字节副本到一个整数变量会受到很大的影响。如果你真的想要优化,可以将3分为2然后分为1,然后可以通过寄存器访问来处理2和1。