LINUX.ORG.RU

История изменений

Исправление 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 во все поля?