Да, в теории. Рассмотрим этот код:
int a, b;
printf("%d\n", &a+1 == &b);
В соответствии с C 2018 6.5.9 6, &a+1 == &b
истинно тогда и только тогда, когда b
случается, если немедленно следует a
в адресном пространстве. ,Это определенное поведение, но поведение реализации C может привести к тому, что результат будет либо 0, либо 1.
Теперь предположим, что реализация C управляет своими идентификаторами через некоторую причудливую структуру данных. Он читает a
и запоминает информацию о нем, запоминает b
и запоминает информацию о нем и так далее. Позже, когда он назначает хранилище объектам, он считывает из своей базы данных идентификаторы. В отсутствие дополнительных ограничений, таких как размер и выравнивание, влияющих на то, как он выделяет хранилище, он может просто распределять хранилище в любом порядке, в котором база данных производит идентификаторы при переходе по базе данных, чтобы получить их.
ЭтоМожно предположить, что простое изменение того, какие идентификаторы находятся в базе данных, может изменить порядок, в котором другие создаются при чтении из базы данных. Таким образом, введение нового имени типа может изменить порядок, в результате чего b
будет следовать за a
в памяти, когда оно не без нового имени.
Другими словами, поведение здесь, относительно того, как именауправляемый и то, как распределено хранилище, по крайней мере частично, неконтролируемо - оно не спроектировано так или иначе. И поэтому оно может измениться, основываясь на принципиально не относящихся к делу вещах.