Почему нет стандартной функции 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

Вы посмотрели тампон?

человеческий мазок