S
{
int f1;
int f2;
};
int z1(S* a1, float* a2)
{
a1->f1 = 1;
a1->f2 = 2;
*a2 = 0.f;
return a1->f1; // может возвратить 1, даже если a2 == &s->f1
}
int z2()
{
void *p = malloc(sizeof(S));
auto s = (S*)p;
s->f1 = 1;
s->f2 = 2;
auto f = (float*)p;
*f = 0.f;
return s->f1; // может возвратить 1 из регистра
}
z1, как я понял, это эталонный случай возможной проблемы оптимизации при strict aliasing, но со вторым я не уверен(сложно поверить)
ну по идее может, но я думаю, что компилятор видит что указатель НЕ валатильный и пишем по одному адресу 1 не используем и сразу пишем 0. он возможно даже запись 1 просто удалит
Обсуждают сегодня