ограничить указателями, которые не вызывают псевдоним при вызове функции, но делают потом - PullRequest
2 голосов
/ 16 февраля 2020

Это безопасно?

foo.h:

struct A {
        struct B *b;
        // more fields
};
struct B {
        // some fields
};

void foo(struct A *restrict a, struct B *restrict b);

foo. c:

void foo(struct A *restrict a, struct B *restrict b)
{
        a->b = &b;
}

bar. c:

void bar(void)
{
        struct A a;
        struct B b;

        // some code. a and b are independent here.
        foo(&a, &b);
        // some more code.  Now a and b aren't independent anymore.
}

Интересно, может ли компилятор неверно предположить из объявления функции, что a не может использоваться для доступа к b после foo(&a, &b); и, следовательно, может оптимизировать вещи, которые не должны.

...