Я хотел посмотреть, будет ли restrict
предотвращать доступ к перекрывающейся памяти с помощью memcpy
. memcpy
функции копий n байт с области памяти src в область памяти dest напрямую. Области памяти не должны перекрываться. memmove
использует буфер , поэтому нет риска перекрытия памяти.
Отборочный определитель restrict
говорит, что для времени жизни указателя только доступ к данным этого объекта будет иметь только сам указатель или значение непосредственно (например, pointer + n
). Если декларация о намерениях не соблюдается и к объекту обращается независимый указатель, это приведет к неопределенному поведению.Почему спецификатор ограничения по-прежнему позволяет memcpy получать доступ к перекрывающейся памяти?
#include <stdio.h>
#include <string.h>
#define SIZE 30
int main()
{
char *restrict itself;
itself = malloc(SIZE);
strcpy(itself, "Does restrict stop undefined behavior?");
printf("%d\n", &itself);
memcpy(itself, itself, SIZE);
puts(itself);
printf("%d\n", &itself);
memcpy(itself-14, itself, SIZE); //intentionally trying to access restricted memory
puts(itself);
printf("%d\n", &itself);
return (0);
}
Output()
Адрес себе: +12345
ли ограничить стоп неопределенное поведение?
Адрес сам по себе: 12345
stop undefined bop undefined поведение?
Адрес себе: 12345
ли memcpy
использовать независимый указатель? Поскольку вывод определенно показывает неопределенное поведение, а restrict
не препятствует доступу к перекрывающейся памяти с memcpy
.
Я предполагаю, что memcpy
имеет преимущество в производительности, поскольку оно копирует данные напрямую, а memmove
использует буфер. Но с современными компьютерами я должен игнорировать эту потенциально лучшую производительность и всегда использовать memmove
, так как он не гарантирует совпадения?
'memmove' не буферизует данные, он действует так, как будто данные буферизованы. Это можно сделать, например, путем проверки того, перемещаются ли данные вперед или назад в памяти, а затем копируются соответственно назад или вперед или назад. На практике это немного сложнее, поскольку копирование данных на передний план имеет проблемы с производительностью, но это идея. – GaspardP
«Ограничение не препятствует доступу к перекрывающейся памяти с помощью« memcpy »- почему вы ожидали этого? И что вы ожидали, когда 'memcpy' попытался получить доступ к перекрывающейся памяти в любом случае (потому что вы сказали ему получить доступ к перекрывающейся памяти)? – immibis
'printf ("% d \ n ", & сам);' вызывает неопределенное поведение, '% d' выводит только' int', но аргумент задается 'char *' –