Почему нет стандартной функции memswap - PullRequest
19 голосов
/ 21 сентября 2008

Почему в стандарте c нет функции memswap, которая, вероятно, будет выглядеть так:

int memswap(void *ptr1, void *ptr2, size_t nbytes)?

Я знаю, что было бы легко написать, но я думаю, что libc мог бы сделать несколько удивительных трюков, чтобы ускорить его, как это делают некоторые реализации для memcpy.

Ответы [ 5 ]

11 голосов
/ 21 сентября 2008

Я думаю, потому что это не нужно очень часто. Тем не менее, есть простой способ сделать это в C ++:

#include <algorithm>

swap_ranges(ptr1, ptr1 + nbytes, ptr2)

Возможно, он не так оптимизирован, как встроенный компилятор, но он может быть быстрее, чем цикл, который вы пишете для себя, поскольку он может иметь оптимизацию для конкретной платформы, которую вы не реализовали бы.

Вы должны быть осторожны с вышесказанным, поскольку предполагается, что ptr1 и ptr2 являются указателями на символы. Более канонический способ сделать это:

#include <algorithm>

swap_ranges(ptr1, ptr1 + num_items, ptr2)
9 голосов
/ 21 сентября 2008

Это не то, что обычно требуется.

Идеи, возможно, были рассмотрены и отброшены, потому что довольно сложно придумать алгоритм общего назначения. Не забывайте, что C - это старый язык, и расширения должны быть в целом полезны.

Возможные условия ошибки: -

  • поведение при смене диапазонов перекрывается
  • длина нуля
  • недостаточно памяти (оптимальная реализация может выделить для этого память)
  • нулевой указатель

Алгоритм best также может зависеть от того, что вы делаете, и поэтому может быть лучше кодировано непосредственно вами.

  • обмен структурами, скорее всего, будет быстрее с использованием временной структуры и присваивания
  • небольшой длины - может быть лучше выделить временную память
  • long length - «сечение» по разделу (где сечение - некоторая оптимальная длина)
  • использование аппаратных функций копирования
3 голосов
/ 21 сентября 2008

Вероятно, это не требуется очень часто в программировании на C, в C ++, где своп является обычной вещью для членов класса, есть алгоритм std :: swap , который высоко оптимизирован для различных типов.

3 голосов
/ 21 сентября 2008

Возможно, потому что это не нужно очень часто - я достаточно часто устанавливаю memset и memcpy, но я не знаю, использовал ли бы я memswap, если бы он был доступен.

0 голосов
/ 26 сентября 2008

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

мазок на человека

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...