为什么没有标准的memswap函数
时间:2020-03-06 14:29:31 来源:igfitidea点击:
为什么C标准没有memswap函数,该函数可能类似于:
int memswap(void *ptr1, void *ptr2, size_t nbytes)?
我知道这很容易编写,但是我认为libc可以做一些很棒的技巧来加快它的速度,就像某些实现为memcpy所做的那样。
解决方案
可能是因为它不是经常需要memset和memcpy,但我不知道我是否曾经使用过memswap(如果有的话)。
我认为是因为它不是很经常需要。但是,在C ++中有一种简单的方法可以做到这一点:
#include <algorithm> swap_ranges(ptr1, ptr1 + nbytes, ptr2)
它可能没有内置的编译器那样优化,但是它有可能比我们自己编写的循环更快,因为它可能具有我们不会实现的特定于平台的优化。
我们确实需要小心上述内容,因为它假定ptr1和ptr2是char指针。更为规范的方法是:
#include <algorithm> swap_ranges(ptr1, ptr1 + num_items, ptr2)
在C编程中可能并不需要很多,在C ++中,对类成员来说交换是经常要做的事情,其中的std :: swap算法针对不同类型进行了高度优化。
这不是常规需要的。
可能已经考虑并放弃了这些想法,因为很难提出通用的算法。不要忘记C是一门古老的语言,扩展通常需要使用。
可能的错误情况:-
- 交换范围重叠时的行为
- 零长度
- 内存不足(最佳实现可能会为此分配内存)
- 空指针
最佳算法也可能取决于工作,因此可以直接由我们更好地编码。
- 使用临时结构和分配可以更快速地交换结构
- 小长度-分配临时内存可能更好
- 长的长度-按部分交换的"部分"(其中部分是某个最佳长度)
- 使用硬件复制功能
你看过药签了吗?
男子拭子