Подтвердить что ты не робот

Значение возврата С++ memcpy

согласно http://en.cppreference.com/w/cpp/string/byte/memcpy С++ memcpy принимает три параметра: назначение, источник и размер/байты. он также возвращает указатель. Почему это так? не являются параметрами, достаточными для ввода и копирования данных.

или я что-то недопонимаю? в примерах не используется возвращаемое значение

4b9b3361

Ответ 1

Если функция не имеет ничего конкретного для возврата, часто принято возвращать один из входных параметров (тот, который рассматривается как первичный). Это позволяет использовать "цепные" вызовы функций в выражениях. Например, вы можете сделать

char buffer[1024];
strcat(strcpy(buffer, "Hello"), " World");

потому что strcpy возвращает исходное значение dst в качестве результата. В принципе, при разработке такой функции вам может понадобиться выбрать наиболее подходящий параметр для "цепочки" и вернуть его в качестве результата (опять же, если вы еще не указали, что нужно вернуть, т.е. Если в противном случае ваша функция вернет void).

Некоторым это нравится, некоторые люди этого не делают. Это вопрос личных предпочтений. Стандартная библиотека C часто поддерживает эту технику, memcpy является еще одним примером. Возможным случаем использования может быть что-то вроде строк

char *clone_buffer(const char *buffer, size_t size)
{
   return memcpy(new char[size], buffer, size);
}

Если memcpy не вернул указатель буфера назначения, нам, вероятно, придется реализовать выше, как

char *clone_buffer(const char *buffer, size_t size)
{
   char *clone = new char[size];
   memcpy(clone, buffer, size);
   return clone;
}

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

Довольно часто люди сбивают с толку, что memcpy возвращает указатель буфера назначения, потому что существует распространенное мнение о том, что возврат формы указателя к функции обычно (или всегда) указывает на то, что функция может выделять/перераспределять память. Хотя это действительно может указывать на последнее, нет такого жесткого правила, и его никогда не было, поэтому часто высказываемое мнение о том, что возвращение указателя (например, memcpy) является чем-то "неправильным" или "плохой практикой", абсолютно необоснованно.

Ответ 2

IIRC, в ранних версиях C не было возврата void. Таким образом, библиотечные функции, которые были вокруг достаточно долго, возвращают что-то по наследственным причинам, и это было лучшее, что они могли придумать.

В string.h есть набор функций, которые возвращают целевой параметр: memcpy, strcpy, strcat. Это не очень полезно, но это не наносит вреда (вероятно, во многих соглашениях о вызовах даже не требуется инструкции для реализации).

Возможно, вы можете придумать следующее: char *nextbuf = memcpy(get_next_buf(), previous_buf+offset, previous_size-offset); вместо char *nextbuf = get_next_buf(); memcpy(nextbuf, etc); Или что-то.

Для сравнения qsort возвращает void. Возможно, было определено, что он возвращает base по принципу "вернуть что-то, это может пригодиться", но не было. std::copy скорее полезнее возвращает итератор в конец выходного диапазона. Для итераторов неслучайного доступа, которые не могут быть тривиальными или даже возможными для вычисления вызывающего.

Ответ 3

Возвращая значение, вызов функции memcpy может использоваться как r-значение.

Ответ 4

Вы можете сделать возврат в пустоту, если хотите указать, что вы его не используете, например:
(void) memcpy(mydest, mysrc, mybytes);

Ответ 5

void* memcpy( void* dest, const void* src, std::size_t count );
returns void * which can be assigned to another void array that can be used as  
int or char data type.
void * ret = new int[6];
ret = memcpy(newarr,arr,sizeof(int)* 5);