我有一个保存 100 字节数据的指针。我想每第二个字节加 5。
例子:
1 2 3 4 5 6
会变成:
1 7 3 9 5 11
现在我知道我可以做一个 for 循环,有没有更快的方法?像 memset 这样的东西会增加每个第二个字节的值吗?
谢谢
循环将是最好的方法。memset() 对于设置连续的内存块非常有效。在这里不会对你有太大帮助。
你有什么格式的字节?作为连接字符?还是字节是 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++ 伪代码。
如果memset
支持增加每第 n 个字节的值,您认为它将如何实现?
实际上,您可以通过使用循环展开使其更快,但您需要知道您的数组是固定大小的。然后,您只需重复分配值即可跳过循环开销:
array[ 1 ] += 5;
array[ 3 ] += 5;
array[ 5 ] += 5;
...
通过这样做,您不会因循环中出现的跳转和测试指令而产生开销,但您会在代码膨胀中为此付出代价。