История изменений
Исправление wandrien, (текущая версия) :
Баг у тех, кто полагается на недокументированное поведение. Ничему вас история IT не учит.
В memcpy ничего не написано не только том, в какую сторону она копирует, но и какими блоками.
Если тебе нужно повторить паттерн размером 32 байта, а реализация копирует блоками по 64 байта, - извините, обломайтесь.
Сначала была реализация, потом к ней придумали стандарт (плохо её описывающий), потом, спустя 30-40 лет, когда все уже забыли про первоисточник этой спецификации, реализацию переделали в сооветствии с перевравшим исходную семантику стандартом.
Различие memcpy и memmove было введено еще в ANSI C на основании анализа существующих реализаций. Там ясно сказано, что задача копирования блока байт должна отвечать двум взаимно-противоречивым требованиям, которые не могут быть удовлетворены одновременно: «быть правильной» (для перекрывающихся регионов) и «быть быстрой». В связи с этим вводятся два отдельных интерфейса.
Никакой задачи «размножения паттерна» не было и никогда не ставилось. С самого начала.
Или ты еще с 85-го года портировать до-ANSI-код на ANSI C не мог в 2010-х, когда уже C99 во все поля?
Исправление wandrien, :
Баг у тех, кто полагается на недокументированное поведение. Ничему вас история IT не учит.
В memcpy ничего не написано не только том, в какую сторону она копирует, но и какими блоками.
Если тебе нужно повторить паттерн размером 32 байта, а реализация копирует блоками по 64 байта, - извините, обломайтесь.
Сначала была реализация, потом к ней придумали стандарт (плохо её описывающий), потом, спустя 30-40 лет, когда все уже забыли про первоисточник этой спецификации, реализацию переделали в сооветствии с перевравшим исходную семантику стандартом.
Различие memcpy и memmove было введено еще в ANSI C на основании анализа существующих реализаций. Там ясно сказано, что задача копирования блока байт должна отвечать двум взаимно-противоречивым требованиям, которые не могут быть удовлетворены одновременно: «быть правильной» (для перекрывающихся регионов) и «быть быстрой». В связи с этим вводятся два отдельных интерфейса.
Никакой задачи «размножения паттерна» не было и никогда не ставилось. С самого начала.
Или ты еще с 85-го года портировать код на ANSI C не мог в 2010-х, когда уже C99 во все поля?
Исправление wandrien, :
Баг у тех, кто полагается на недокументированное поведение. Ничему вас история IT не учит.
В memcpy ничего не написано не только том, в какую сторону она копирует, но и какими блоками.
Если тебе нужно повторить паттерн размером 32 байта, а реализация копирует блоками по 64 байта, - извините, обломайтесь.
Сначала была реализация, потом к ней придумали стандарт (плохо её описывающий), потом, спустя 30-40 лет, когда все уже забыли про первоисточник этой спецификации, реализацию переделали в сооветствии с перевравшим исходную семантику стандартом.
Различие memcpy и memmove было введено еще в ANSI C на основании анализа существующих реализаций. Там ясно сказано, что задача копирования блока байт должна отвечать двум взаимно-противоречивым требованиям, которые не могут быть удовлтеворены одновременно: «быть правильной» (для перекрывающихся регионов) и «быть быстрой». В связи с этим вводятся два отдельных интерфейса.
Никакой задачи «размножения паттерна» не было и никогда не ставилось. С самого начала.
Или ты еще с 85-го года портировать код на ANSI C не мог в 2010-х, когда уже C99 во все поля?
Исходная версия wandrien, :
Баг у тех, кто полагается на недокументированное поведение. Ничему вас история IT не учит.
В memcpy ничего не написано не только том, в какую сторону она копирует, но и какими блоками.
Если тебе нужно повторить паттерн размером 32 байта, а реализация копирует блоками по 64 байта, - извините, обломайтесь.
Сначала была реализация, потом к ней придумали стандарт (плохо её описывающий), потом, спустя 30-40 лет, когда все уже забыли про первоисточник этой спецификации, реализацию переделали в сооветствии с перевравшим исходную семантику стандартом.
Различие memcpy и memmove было введено еще в ANSI C на оснвоании анализа существующих реализаций. Там ясно сказано, что задача копирования блока байт должна отвечать двум взаимно-противоречивым требованиям, которые не могут быть удовлтеворены одновременно: «быть правильной» (для перекрывающихся регионов) и «быть быстрой». В связи с этим вводятся два отдельных интерфейса.
Никакой задачи «размножения паттерна» не было и никогда не ставилось. С самого начала.
Или ты еще с 85-го года портировать код на ANSI C не мог в 2010-х, когда уже C99 во все поля?