Почему нет стандартной функции memswap
Почему у меня нет стандартной функции memswap, которая, вероятно, будет выглядеть следующим образом:
int memswap(void *ptr1, void *ptr2, size_t nbytes)?
Я знаю, что было бы легко писать, но я думаю, что libc мог бы сделать некоторые потрясающие трюки, чтобы ускорить его, как некоторые реализации делают это для memcpy.
Ответы
Ответ 1
Это не то, что обычно требуется.
Идеи, возможно, были рассмотрены и отброшены, потому что довольно сложно придумать алгоритм, который является общим назначением. Не забывайте, что C - это старый язык, и расширения должны быть в целом полезными.
Возможные условия ошибки: -
- когда перекрывающиеся диапазоны перекрываются
- длина нуля
- нехватка памяти (оптимальная реализация может выделить память для этого)
- нулевой указатель
Алгоритм лучший также может зависеть от того, что вы делаете, и поэтому может быть лучше закодирован вами напрямую.
- структуры обмена, вероятно, будут быстрее использовать временную структуру и назначение
- малая длина - может быть лучше выделение временной памяти
- длинная длина - "секция" по разделу swap (где раздел - оптимальная длина)
- использование функций копирования оборудования
Ответ 2
Я думаю, потому что он не нужен очень часто. Однако в С++ есть простой способ сделать это:
#include <algorithm>
swap_ranges(ptr1, ptr1 + nbytes, ptr2)
Это может быть не так оптимизирован, как встроенный компилятор, но у него есть потенциал быть быстрее, чем цикл, который вы пишете для себя, поскольку он может иметь определенную оптимизацию платформы, которую вы бы не реализовали.
Вам нужно быть осторожным с приведенным выше, потому что предполагается, что ptr1 и ptr2 являются указателями char. Более канонический способ сделать это:
#include <algorithm>
swap_ranges(ptr1, ptr1 + num_items, ptr2)
Ответ 3
Вероятно, потому что это не очень часто - я memset и memcpy достаточно часто, но я не знаю, что когда-либо использовал memswap, если бы он был доступен.
Ответ 4
Скорее всего, это не требуется очень часто в программировании на C, в С++, где своп - это обычная вещь для членов класса, там std:: swap, который оптимизирован для разных типов.
Ответ 5
Вы посмотрели тампон?
человеческий мазок