Код: Выделить всё
mmapstd::memmove
Определено в заголовке
void* memmove( void* dest, const void* src, std::size_t count );
Выполняет следующие операции по порядку:
1- Неявно создает объекты по адресу dest.
2- Копирует символы счетчика (как если бы они имели тип unsigned char, то же самое ниже) из объекта, на который указывает src, во временный массив arr символов-счетчика, где arr не перекрывает объекты, на которые указывают dest и src.
3- Копирует символы счетчика из arr в объект, на который указывает dest.
(выделено мной).
Но, глядя на стандарт, поведение этих функций соответствует стандарту C (раздел 7.28.2.3 для std::memmove), который не описывает эту последовательность операций (поскольку понятие объекта не такое, как в C++):
Описание
Функция memmove копирует n символов из объекта, на который указывает s2, в объект, на который указывает s1. Копирование происходит так, как будто n символов из объекта, на который указывает s2, сначала копируются во временный массив из n символов, который не перекрывает объекты, на которые указывают s1 и s2, а затем n символов из временного массива копируются в объект, на который указывает s1.
Более того, эти функции фактически неявно создают объекты в месте назначения (https://eel.is/c++draft/cstring.syn#3).
Так является ли cppreference переусердством и можно ли законно использовать эти функции в «необработанной» ячейке памяти (как я подозреваю из стандарта C)? (примечание: каков статус в C++ ячейки памяти, возвращаемой C-API (например, mmap)? (возможно, это должен быть другой вопрос))
Подробнее здесь: https://stackoverflow.com/questions/798 ... -cpprefere
Мобильная версия