Ограничить ключевые слова и указатели внутри структур - программирование
Подтвердить что ты не робот

Ограничить ключевые слова и указатели внутри структур

Используя ключевое слово restrict:

int f(int* restrict a, int* restrict b);

Я могу дать указание компилятору, что массивы a и b не перекрываются. Скажем, у меня есть структура:

struct s{
(...)
int* ip;
};

и напишите функцию, которая принимает два объекта struct s:

int f2(struct s a, struct s b);

Как я могу так же объяснить компилятору в этом случае, что a.ip и b.ip не перекрываются?

4b9b3361

Ответ 1

Вы также можете использовать restrict внутри структуры.

struct s {
    /* ... */
    int * restrict ip;
};

int f2(struct s a, struct s b)
{
    /* ... */
}

Таким образом, компилятор может предположить, что a.ip и b.ip используются для обозначения непересекающегося объекта в течение продолжительности каждого вызова функции f2.

Ответ 2

Как и везде: через объектно-ориентированный дизайн.

static void private_function (restrict int* aip, restrict int* bip);

void public_function (restrict struct type* a, restrict struct type* b)
{
  private_function(a->ip, b->ip);
}

Ответ 3

Проверьте этот указатель, вы можете получить некоторую помощь.

// xa and xb pointers cannot overlap ie. point to same memmpry location.
void function (restrict int *xa, restrict int *xb)
{
    int temp = *xa;
    *xa = *xb;
    xb = temp;
}

Если два указателя объявлены как ограничивающие, эти два указателя не перекрываются.

EDITED

Проверьте эту ссылку для получения дополнительных примеров