2

我有一个保存 100 字节数据的指针。我想每第二个字节加 5。

例子:

1 2 3 4 5 6

会变成:

1 7 3 9 5 11

现在我知道我可以做一个 for 循环,有没有更快的方法?像 memset 这样的东西会增加每个第二个字节的值吗?

谢谢

4

4 回答 4

2

循环将是最好的方法。memset() 对于设置连续的内存块非常有效。在这里不会对你有太大帮助。

于 2010-12-21T23:51:16.420 回答
2

你有什么格式的字节?作为连接字符?还是字节是 uint32 的子部分?

通常,循环是执行此操作的最佳方式 - 即使您能够使用 memset 应用类似模式的掩码,您仍然需要创建它,并且这将花费相同数量的 CPU 周期。

如果每个元素有 4 个字节(例如 uint32),则可以通过创建预定义的添加掩码将 cpu 周期减半。但注意:这样的解决方案不会检查溢出(伪代码):

uint32* ptr = new uint32[16]; // creates 64 bytes of data
(...) fill data
for (int k=0; k < 16; ++k)
{
   // Hardcored Add-Mask for Little Endian systems
   ptr[k] += 0x05000500; // dereference and add mask to content
}

编辑:请注意,这假设一个小端系统并且是 C++ 伪代码。

于 2010-12-21T23:53:41.010 回答
0

如果memset支持增加每第 n 个字节的值,您认为它将如何实现?

于 2010-12-21T23:49:57.720 回答
0

实际上,您可以通过使用循环展开使其更快,但您需要知道您的数组是固定大小的。然后,您只需重复分配值即可跳过循环开销:

array[ 1 ] += 5;
array[ 3 ] += 5;
array[ 5 ] += 5;
...

通过这样做,您不会因循环中出现的跳转和测试指令而产生开销,但您会在代码膨胀中为此付出代价。

于 2010-12-22T00:13:05.790 回答