struct, и ее адрес. |
Здравствуйте, гость ( Вход | Регистрация )
struct, и ее адрес. |
Гость_TheGuest_* |
9.7.2015, 21:49
Сообщение
#1
|
Гости |
Доброго времени суток. У меня вопрос.
К примеру есть структура.
А теперь вопрос. Почему у структуры a и у a.x один и тот же адрес??? Ситуация с b и b.x такая же, почему так ?? Это как в одномерных массивах получается ? Спасибо. |
|
|
Гость_Гость_* |
9.7.2015, 22:15
Сообщение
#2
|
Гости |
Почему у структуры a и у a.x один и тот же адрес? А почему нет? Что такое структура? Набор нескольких переменных в одном блоке. Переменные размещаются в порядке объявления. Естественно, что адрес структуры совпадёт с адресом её первого элемента. А теперь добавьте к структуре конструктор, деструктор и какой-либо метод. Получим класс (struct в C++ - класс, где всё по умолчанию public). Для него &a и &a.x уже будут разными. (Или не будут - как компилятор разместит...) |
|
|
Гость_TheGuest_* |
9.7.2015, 22:28
Сообщение
#3
|
Гости |
Почему у структуры a и у a.x один и тот же адрес? А почему нет? Что такое структура? Набор нескольких переменных в одном блоке. Переменные размещаются в порядке объявления. Естественно, что адрес структуры совпадёт с адресом её первого элемента. А теперь добавьте к структуре конструктор, деструктор и какой-либо метод. Получим класс (struct в C++ - класс, где всё по умолчанию public). Для него &a и &a.x уже будут разными. (Или не будут - как компилятор разместит...) Попробовал. Добавил функцию.
Но адреса остались прежними. Но все равно, спасибо Вам за разъяснения! |
|
|
ahalaj |
10.7.2015, 0:39
Сообщение
#4
|
Студент Группа: Участник Сообщений: 47 Регистрация: 14.6.2014 Пользователь №: 4166 Спасибо сказали: 13 раз(а) Репутация: 1 |
|
|
|
Гость_TheGuest_* |
10.7.2015, 1:07
Сообщение
#5
|
Гости |
|
|
|
Iron Bug |
10.7.2015, 9:21
Сообщение
#6
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
Правда, как дописал virtual, адреса поменялись, а почему так происходит?? потому что создаётся таблица виртуальных методов и компилятор помещает её в начале области памяти структуры (или класса). почитай про таблицу виртуальных методов, например, здесь. там очень упрощённо, на примере GCC, описана схема распределения памяти для указателей на виртуальные таблицы. компиляторы делают это немного по-разному, но таблица виртуальных методов всегда в начале блока. P.S. это хорошо, что ты интересуешься тем, как всё устроено внутри. хорошее понимание того, как работает компилятор, никогда не помешает. а сейчас это редко встречается. обычно новички задают вопросы, как покрасить кнопочку в зелёный цвет или около того |
|
|
Влад |
10.7.2015, 11:08
Сообщение
#7
|
Участник Группа: Участник Сообщений: 146 Регистрация: 20.3.2009 Из: Санкт-Петербург Пользователь №: 627 Спасибо сказали: 46 раз(а) Репутация: 8 |
потому что создаётся таблица виртуальных методов и компилятор помещает её в начале области памяти структуры (или класса). [......] компиляторы делают это немного по-разному, но таблица виртуальных методов всегда в начале блока. Более точно будет сказать, что компилятор может разместить ТВМ в начале блока. А может - разместить где-то еще, т.к. Стандартом этот layout не специфицирован. |
|
|
Iron Bug |
10.7.2015, 12:30
Сообщение
#8
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
|
|
|
Влад |
10.7.2015, 13:24
Сообщение
#9
|
Участник Группа: Участник Сообщений: 146 Регистрация: 20.3.2009 Из: Санкт-Петербург Пользователь №: 627 Спасибо сказали: 46 раз(а) Репутация: 8 |
Хмм. Имей в виду, что это поведение некоторых конкретных компиляторов, и полагаться, что так оно будет "всегда и везде" - крайне опасно.
Приведу пример из собственного опыта: "Считается", что физическое представление NULL-указателя - это 0x00000000. И все известные мне компиляторы для x86 так и поступают. Даже в хидерах оно прописано. Но вот энное время назад мне довелось поработать с архитектурой (Гарвард, ага), в которой адрес 0x00000000 был вполне себе валидным, и по этому адресу могли располагаться реальные объекты. Ага, а NULL-указатель в оной архитектуре имел физическое значение 0xFFFFFFFF...... (Си-компилер автомагически преобразовывал литеральный ноль в это самое значение. Что полностью соответствует требованию Библии.) Так что, вишь как, могут быть варианты....... |
|
|
Гость_TheGuest_* |
10.7.2015, 13:48
Сообщение
#10
|
Гости |
Теперь понятно все, спасибо вам всем за разъяснения!!!
|
|
|
Текстовая версия | Сейчас: 19.4.2024, 5:39 |