如果您没有被绑定到一个简单的数组,您可以创建一个“MRU”结构列表,其中该结构可以包含一个标志,指示自上次检查后项目是否已更改。
每次项目更改时,设置“更改标志”并将其移动到列表的头部。当您需要检查更改的项目时,您从头部遍历列表并取消设置更改的标志并在未设置更改标志的第一个元素处停止。
抱歉,我错过了关于数组只有 8 个字节长的部分。有了这些信息和您编辑的新信息,我认为之前的建议并不理想。
如果数组只有 8 字节长,为什么不缓存前一个数组的副本并将其与收到的新数组进行比较?
以下是我对“快捷方式”比较的评论的澄清。如何实现这取决于所用平台上的 sizeof(int) 是什么。
使用 64 位整数,您可以通过比较来确定数组是否已更改。例如:
#define ARR_SIZE 8
unsigned char cachedArr[ARR_SIZE];
unsigned char targetArr[ARR_SIZE];
unsigned int *ic = (unsigned int *)cachedArr;
unsigned int *it = (unsigned int *)targetArr;
// This assertion needs to be true for this implementation to work
// correctly.
assert(sizeof(int) == sizeof(cachedArr));
/*
** ...
** assume initialization and other suff here
** leading into the main loop that is receiving the target array data.
** ...
*/
if (*ic != *it)
{
// Target array has changed; find out which element(s) changed.
// If you only cared that there was a change and did not care
// to know which specific element(s) had changed you could forego
// this loop altogether.
for (int i = 0; i < ARR_SIZE; i++)
{
if (cachedArr[i] != targetArr[i])
{
// Do whatever needs to be done based on the i'th element
// changed
}
}
// Cache the array again since it has changed.
memcpy(cachedArr, targetArr, sizeof(cachedArr));
}
// else no change to the array
如果本机整数大小小于 64 位,您可以使用相同的理论,但您必须循环遍历数组 sizeof(cachedArr) / sizeof(unsigned int) 次;如果更改发生在最后一个测试块中,则会涉及最坏的情况(但并不总是存在)。
应该注意,在将任何 char 转换为整数类型时,您可能需要考虑对齐(如果 char 数据与适当的字长边界对齐)。
然而,进一步考虑这一点,最好自己展开循环并执行以下操作:
if (cachedArr[0] != targetArr[0])
{
doElement0ChangedWork();
}
if (cachedArr[1] != targetArr[1])
{
doElement1ChangedWork();
}
if (cachedArr[2] != targetArr[2])
{
doElement2ChangedWork();
}
if (cachedArr[3] != targetArr[3])
{
doElement3ChangedWork();
}
if (cachedArr[4] != targetArr[4])
{
doElement4ChangedWork();
}
if (cachedArr[5] != targetArr[5])
{
doElement5ChangedWork();
}
if (cachedArr[6] != targetArr[6])
{
doElement6ChangedWork();
}
if (cachedArr[7] != targetArr[7])
{
doElement7ChangedWork();
}
同样,取决于是否知道哪些特定元素发生了变化,可以收紧。这将导致需要更多的指令内存,但消除了循环开销(良好的旧内存与速度的权衡)。
与任何与时间/记忆相关的测试一样,测量、比较、调整和重复,直到达到预期的结果。