Стандарт C++ на адрес унаследованных членов

Стандарт C++ говорит что-нибудь об адресе унаследованных членов? Например, если я наследую элемент int или не виртуальный метод, он говорит что-нибудь о его адресе или виртуальном члене: если я не переопределяю его, если я делаю? Конструктор, если я использую предыдущий конструктор? Операторы, перегруженные операторы, члены шаблона? Это говорит что-нибудь об этих вещах?

1 ответ

Решение

Стандарт, раздел 1.8 посвящен объектной модели C++.

В нем мало что сказано: объект является областью памяти (но может содержать неиспользуемые зоны для выравнивания) и может содержать подобъекты (подобъекты-члены или подобъекты базового класса, или подобъекты массива). Из определения законченного объекта вы можете сделать вывод, что подобъекты включены в область памяти их объекта. И это говорит о том, что два разных объекта, которые не являются ни битовыми полями, ни подобъектами базового класса, должны иметь разные адреса.

Раздел 9.2/15 дает некоторую дополнительную информацию о порядке адресации в объекте:

Нестатические члены данных (не объединяющего) класса с одинаковым контролем доступа распределяются так, чтобы более поздние члены имели более высокие адреса в объекте класса. Порядок распределения нестатических элементов данных с различным контролем доступа не определен. Требования выравнивания реализации могут привести к тому, что два смежных элемента не будут выделяться сразу после друг друга; то же самое касается требований к пространству для управления виртуальными функциями и виртуальными базовыми классами.

Есть несколько предложений об объединениях, когда все члены объединения являются структурами, начинающимися с одинаковой последовательности типов. Затем разрешается "проверять общие части", из чего можно сделать вывод, что они должны иметь один и тот же адрес.

Наконец, я нашел последний в 9.2/21:

Указатель на объект структуры стандартной компоновки, соответствующим образом преобразованный с использованием reinterpret_cast, указывает на его начальный элемент (или, если этот элемент является битовым полем, то на модуль, в котором он находится), и наоборот.

И в принципе, это все. Вы видите, что здесь много вещей, определяемых реализацией, о точной компоновке каждого объекта.

К сожалению, вы даже не можете много говорить об адресе подобъекта базового класса и его производного объекта: также может быть множественное наследование. Таким образом, стандарт не использует адресные предположения: он скорее заявляет такие вещи, как: "Если базовый класс доступен, можно неявно преобразовать указатель на производный класс в указатель на этот базовый класс"

Другие вопросы по тегам