gpt4 book ai didi

c++ - 支持单个位偏移的类似“memcpy”的函数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:35:40 25 4
gpt4 key购买 nike

我正在考虑解决这个问题,但它看起来是一项艰巨的任务。如果我自己拿这个,我可能会用几种不同的方式编写它并选择最好的,所以我想我会问这个问题,看看是否有一个好的图书馆已经解决了这个问题,或者是否有人有想法/建议。

void OffsetMemCpy(u8* pDest, u8* pSrc, u8 srcBitOffset, size size)
{
// Or something along these lines. srcBitOffset is 0-7, so the pSrc buffer
// needs to be up to one byte longer than it would need to be in memcpy.
// Maybe explicitly providing the end of the buffer is best.
// Also note that pSrc has NO alignment assumptions at all.
}

我的应用程序时间紧迫,因此我想以最小的开销来解决这个问题。这是困难/复杂性的来源。在我的例子中, block 可能非常小,可能是 4-12 字节,所以大规模的 memcpy 东西(例如预取)并不是那么重要。对于随机未对齐的 src 缓冲区,最好的结果是对于 4 到 12 之间的恒定“大小”输入,最快的结果。

  • 应尽可能以字大小的 block 移动内存
  • 对齐这些字大小的 block 很重要。 pSrc 未对齐,因此我们可能需要从前面读取几个字节,直到它对齐。

有人拥有或知道类似的实现吗?或者是否有人想尝试编写此代码,使其尽可能简洁高效?

编辑:似乎人们将这个“接近”投票为“太宽泛”。一些缩小的细节将是 AMD64 是首选架构,所以让我们假设。这意味着 little endian 等。实现有望很好地适应答案的大小,所以我认为这不会太宽泛。我要求的答案是一次单一的实现,尽管有几种方法。

最佳答案

我将从这样一个简单的实现开始:

inline void OffsetMemCpy(uint8_t* pDest, const uint8_t* pSrc, const uint8_t srcBitOffset, const size_t size)
{
if (srcBitOffset == 0)
{
for (size_t i = 0; i < size; ++i)
{
pDest[i] = pSrc[i];
}
}
else if (size > 0)
{
uint8_t v0 = pSrc[0];
for (size_t i = 0; i < size; ++i)
{
uint8_t v1 = pSrc[i + 1];
pDest[i] = (v0 << srcBitOffset) | (v1 >> (CHAR_BIT - srcBitOffset));
v0 = v1;
}
}
}

(警告:未经测试的代码!)。

一旦运行正常,然后在您的应用程序中对其进行分析 - 您可能会发现它的速度足以满足您的需求,从而避免过早优化的陷阱。如果没有,那么您就有了一个有用的基线引用实现,可用于进一步的优化工作。

请注意,对于小拷贝,测试对齐和字大小拷贝等的开销可能远远超过任何好处,因此像上面这样的简单逐字节循环可能接近最佳。

另请注意,优化很可能与架构相关 - 对一个 CPU 有益的微优化可能对另一个 CPU 适得其反。

关于c++ - 支持单个位偏移的类似“memcpy”的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32043911/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com