为什么没有标准的memswap功能

qui*_*ars 20 c

为什么没有c标准的memswap函数,可能看起来像:

int memswap(void *ptr1, void *ptr2, size_t nbytes)?
Run Code Online (Sandbox Code Playgroud)

我知道写起来很容易,但我认为libc可以做一些很棒的技巧来加速它,就像一些实现为memcpy做的那样.

dvo*_*rak 12

我认为因为它不经常需要.但是,有一种简单的方法可以在C++中执行此操作:

#include <algorithm>

swap_ranges(ptr1, ptr1 + nbytes, ptr2)
Run Code Online (Sandbox Code Playgroud)

它可能不像内置的编译器那样优化,但它有可能比你自己编写的循环更快,因为它可能具有你不会实现的特定于平台的优化.

你需要注意上面的内容,因为它假设ptr1和ptr2是char指针.更典型的方法是:

#include <algorithm>

swap_ranges(ptr1, ptr1 + num_items, ptr2)
Run Code Online (Sandbox Code Playgroud)


itj*_*itj 8

这不是常规所需的.

可能已经考虑并放弃了这些想法,因为很难想出一种通用的算法.不要忘记C是一种古老的语言,扩展需要通常有用.

可能的错误情况: -

  • 交换范围重叠时的行为
  • 零长度
  • 内存不足(最佳实现可能会分配内存来执行此操作)
  • 空指针

最好的算法可能也取决于你在做什么,所以可以得到更好的直接编码.

  • 使用临时结构和赋值可能更快地交换结构
  • 小长度 - 可能更好地分配临时内存
  • 长度 - 部分交换的"部分"(部分是一些最佳长度)
  • 使用硬件复制功能

  • 最好的算法不一定是你的.GCC将`memset`作为一个关键字,根据你正在设置的内容,它可能会留下函数调用,或者有一个for循环,或者有一个展开的for循环等等.编译器现在很聪明. (5认同)
  • 所有这些可能的错误条件和优化机会同样适用于`memcpy`(除了内存不足,这对于`memcpy`来说不是问题,也不一定是'memswap`的问题).我不认为有任何*技术*原因`memswap`无法提供. (5认同)
  • 好吧,这些的自然结果是:重叠 -&gt; UB,长度== 0 -&gt; 无操作,应该就地,可能使用固定数量的堆栈,空指针 -&gt; UB。那里没有任何令人惊讶的地方。 (3认同)
  • @Claudiu:GCC不会将`memset`视为关键字。它将其视为函数的名称,但是由于它是标准函数,因此可以替代其自己的实现。 (2认同)