![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Gunslinger |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
Видимо для оптимизации, методы для всех объектов одного класса создаются в единственном экземпляре. А как при множественном наследовании? Методы всех наследуемых классов компилятор организовывает в один последовательный блок памяти или нет?
Например, псевдокод:
В памяти будет вроде:
И вариант, когда в коде создаем не только объект-наследник, но и объекты классов А и В. Это сообщение отредактировал(а) Gunslinger - 11.1.2010, 17:29 |
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
С точки зрения расположения в памяти методы класса ничем не отличаются от обычных функций. И в памяти они будут лежать как обычные функции. С переменными класса эта память никак не пересекается.
|
|||
|
||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
нет, методы (функции члены) описываются внутри класса фактически только для задания области видимости в отличие от дата-членов.
фактически :
Это сообщение отредактировал(а) mes - 11.1.2010, 18:56 |
||||||
|
|||||||
| EnergoHokum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
Здесь неплохо расписано, как выглядит наследование C++ на низком уровне.
|
|||
|
||||
| Gunslinger |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
EnergoHokum, ок.
Из статьи: "При наследовании в результирующем классе объединяются только члены с данными! Все методы существуют в единственном экземпляре." Я так понял, что компилятор для кода
создаст не
а... "распылит", что ли, по памяти.
Есть ли вообще прикладной смысл в этом знании? Какая-то мысль с приведениями указателей крутится. |
||||||
|
|||||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
почитай Lippman. Inside the C++ Object Model я думаю там будет ответ на твой вопрос |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
по какой памяти ?
и
размещаются в памяти одинаково, только не в той памяти которую Вы судя по всему, имели ввиду. Это сообщение отредактировал(а) mes - 13.1.2010, 12:29 |
||||
|
|||||
| Gunslinger |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
Нашел Липпмана, которого ты в прошлой теме советовал, но по отзывам в переводе неточности, а в коде встречаются ошибки. Так что я не рискнул. Эту книгу только на торрентсе нашел, пока не скачал. Тогда в адресном пространстве?
ps. Возможны синтаксические неточности. Это сообщение отредактировал(а) Gunslinger - 14.1.2010, 13:13 |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Ваш пример не понял.. можете объяснить, как создание объекта связано с расположением функций(-членов)? |
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
||||
|
||||
| Gunslinger |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
Тогда сегодня скачаю, заодно и по объектной модели.
Попробую... Вот мои мысли: 1. Приведение указателя -- адрес остается тем же, только меняется тип. Т.е. указывал на участок памяти одного размера (начиная с какого-то адреса), теперь указывает на участок памяти другого размера (при этом, начиная с того же самого адреса). 2. Наследование С: public A, pubic B, ... . Методы классов родителей и наследника объединяются и располагаются в памяти друг за другом, в порядке списка наследования -- сначала А, затем В и С. Таким образом с помощью указателя можно получать доступ к методам не только наследника, но и всех его родителей, перемещаясь по этой области памяти. То есть тот же самый код:
|
||||||
|
|||||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Методы - это ОБЫЧНЫЕ функции с неявным дополнительным формальным параметром. |
|||
|
||||
| Gunslinger |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
Я не писал о данных. При чем здесь они? Я уже знаю, что они лежат отдельно, а у методов есть this на них.
Вот это я и хочу понять. Получается, например, так: есть 2 класса и есть класс 3 - их наследник. Копию родителей не создает, понятно. А как располагает в адресном пространстве? Друг за другом или нет? |
|||
|
||||
| mes |
|
||||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
зря Вы перешли к множественному наследованию не разобравшись с классическим. При множественном наследовании это не так. Адрес меняется.
Какое отношение расположение методов имеет к указателю this ? какой бы ни был this методы всегда продолжают лежать на своем месте, и
Кажись я понял в чем дело.. Вас сбила терминология. Есть два разных добирания... Когда речь идет о добирании до методов, роль играет не значение указателя (оно может бытэ любым хоть NULL), а его тип. И второе добирание, когда функция-член посредством this хочет добраться до данных. В примере ниже мы не используем ни виртуальных ни данных объекта, поэтому смело можем передавать NULL в качестве аргумента. (но не забываем что пример тестовый и в реале подобный подход не рекомендуется) И в зависимости от приведения у нас выберется нужная функция.
|
||||||||
|
|||||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |