целая точка of restrict
- обещать доступ через один указатель, а не другой. Тем не менее, есть примеры, когда перекрывающиеся адреса памяти не будут подразумевать сглаживание. Например:Гранулярность ограничителя для наложения указателей, типов
int* arr_ptr0 = &arr[0];
int* arr_ptr1 = &arr[1];
for (int i=0;i<10;++i) {
*arr_ptr0 = *arr_ptr1;
arr_ptr0 += 2;
arr_ptr1 += 2;
}
Дело в том, эти указатели на самом деле сделать точку перекрытия памяти! В данном конкретном примере такие направляющие, как this, например, например:
Это действительно. , , чтобы указать на один и тот же объект массива, если диапазон элементов, доступных через один из указателей, не перекрывается с диапазоном элементов, доступных через другой указатель.
Мой вопрос: Какая зернистость является «элементами»?
Например, предположим, что у меня есть массив типа struct Foo
. Должен ли я действительно гарантировать, что я не получаю доступ к одному и тому же диапазону элементов (Foo
s), даже если частей Я имею доступ непересекающимися? Вот простой, скалярный пример:
struct Foo { int i; float f; };
void f(struct Foo*restrict foo0, struct Foo*restrict foo1) {
foo0->i = 6;
foo1->f = 19.0f;
}
void g(struct Foo* foo) {
f(foo,foo); /* problem? */
}
Вы можете столкнуться с подобными проблемами с указателями различных типов (например, char
против int
), но, возможно, структура выше примером является более ясным.
AFAIUI, да, вам действительно нужно убедиться, что вы не имеете доступа к той же структуре, независимо от какой части структуры, к которой вы обращаетесь, через два разных указателя. Это даже не вопрос «того же времени»; это «тот же вызов функции». Итак, если вы обращаетесь к 'ptr1 [a] .. ptr1 [b]' (a
@JonathanLeffler: Это не «тот же вызов функции», а время жизни выполнения конкретного блока, связанное с временем жизни указателя с ограничением. –