USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« : 06-06-2005 07:27 » |
|
Может быть вопрос немного ламерский, но хотелось бы окончательно развеять свои сомнения
Есть несколько объектов например 5 В каждом объекте есть член класс например m_MemberClass У этого m_MemberClass все функции описаны как Static Значит ли это что для всех объектов будет физичечки выделена память только для одного экземпляра функций m_MemberClass или же для каждого объекта будет свой вариант статических функций m_MemberClass?
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
Alf
Гость
|
|
« Ответ #1 : 06-06-2005 07:35 » |
|
Независимо от того, является ли функция статической или нет, в экземпляре класса для нее память отводиться не будет. Экземпляр хранит лишь переменные состояния, все функции данного класса хранятся отдельно.
Отличие статических функций лишь в том, что их можно вызывать, не создавая экземпляр класса.
|
|
|
Записан
|
|
|
|
USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #2 : 06-06-2005 07:45 » |
|
Независимо от того, является ли функция статической или нет, в экземпляре класса для нее память отводиться не будет. Экземпляр хранит лишь переменные состояния, все функции данного класса хранятся отдельно.
Отличие статических функций лишь в том, что их можно вызывать, не создавая экземпляр класса.
Т.е. когда я создаю экземпляр класса например new CEdit под функции память не выделяется? А где они тогда хранятся?
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
Alf
Гость
|
|
« Ответ #3 : 06-06-2005 07:55 » |
|
Они хранятся там же, где и остальной код программы. Иначе возникли бы проблемы.
Во-первых, это накладно. Представь себе, что ты написал класс CComplex для работы с комплексными числами. Он включает в себя два числа - действительную и мнимую части - и кучу функций и операторов для работы с ними. Если тебе нужен массив из многих тысяч таких чисел, пришлось бы держать в памяти огромное количество копий этих функций. А во главу угла при разработке языка Страуструп ставил сохранение эффективности С, т.е дополнительные возможности С++ не должны тащить за собой ощутимых накладных расходов.
Во-вторых, это просто не нужно, поскольку код для всех экземпляров один и тот же. Хранить множество копий одних и тех же функций нерационально, да еще и чревато ошибками (а что, если одна из них будет отличаться от других?).
Можешь попробовать проверить это на практике. Посмотри, что вернет функция sizeof для объекта с большим количеством функций. Или создай его на куче и погляди в отладчике, что творится в памяти на самом деле.
|
|
|
Записан
|
|
|
|
USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #4 : 06-06-2005 08:02 » |
|
Альф
Т.е. как я понял можно смело создавать сколь угодно много объектов и члены функции их члена m_Member ничего не будут весить? Ну чтож надеюсь это действительно так иначе у меня будут проблемы с памятью
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
Alf
Гость
|
|
« Ответ #5 : 06-06-2005 08:14 » |
|
Совершенно правильно понял. Все члены-функции будут храниться в единственном экземпляре, без разницы, статические они или нет.
|
|
|
Записан
|
|
|
|
USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #6 : 06-06-2005 08:32 » |
|
Совершенно правильно понял. Все члены-функции будут храниться в единственном экземпляре, без разницы, статические они или нет.
А где про это можно почитать У Страустрапа я чтото ничего не могу по этому поводу найти
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
Alf
Гость
|
|
« Ответ #7 : 06-06-2005 08:43 » |
|
Вечером дома погляжу, на работе Старуструпа нет. Хотя не уверен,что он про такие низкоуровневые вещи пишет.
|
|
|
Записан
|
|
|
|
USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #8 : 08-06-2005 02:00 » |
|
Альф
Ну что там? Не нашел?
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
Alf
Гость
|
|
« Ответ #9 : 08-06-2005 06:15 » |
|
Пока нет... Придется тебе пока поверить на слово. Ну или пройтись отладчиком и убедиться лично.
|
|
|
Записан
|
|
|
|
Anchorite
Гость
|
|
« Ответ #10 : 12-06-2005 18:53 » |
|
USBLexus скажи пожалуйста, как ты представляешь себе выделение памяти под методы конкретного объекта?
|
|
|
Записан
|
|
|
|
USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #11 : 14-06-2005 01:44 » |
|
USBLexus скажи пожалуйста, как ты представляешь себе выделение памяти под методы конкретного объекта?
В смысле? А как ты представляешь себе выделение памяти под конкретную программу? Вот точно также я себе представлял выделение памяти под экземпляр класса
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
Anchorite
Гость
|
|
« Ответ #12 : 14-06-2005 17:26 » |
|
Т.е. ты представляешь это таким образом: 1. Распеределяем блоки памяти под данные объекта и под его код. 2. Инициализируем данные и код. Все-бы это имело смысл, если бы КАЖДЫЙ объект существовал в своем СОБСТВЕННОМ адресном пространстве. В нашем случае этого нет, т.к. все объекты "живут" в одном адресном пространстве (создаются внутри одного процесса). Поэтому проще и быстрее распределять только данные, а код методов иметь в единственном экземпляре. А при вызове метода объекта просто передать ему еще один параметр (положение данных в памяти) и при доступе к данным класса использовать именно его. Кстати подумай на досуге для чего в С++ есть указатель this и кто и когда его инициализирует.
|
|
|
Записан
|
|
|
|
USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #13 : 15-06-2005 01:57 » |
|
про выделение памяти для методов я уже вообще то разобрался с Альфовой помощью Лучше дай ссылку на первоисточники, сам хочу про это почитать
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
Anchorite
Гость
|
|
« Ответ #14 : 15-06-2005 16:26 » |
|
Первоисточником всего этого для меня является мой личный опыт работы с дизассемблерами и отладчиками,
Альф правильно сказал - или верь на слово или напиши простую прогу с использованием объектов в различных вариантах (Статическом, автоматическом и динамическими. С виртуальными методами и без них), а потом дизассемблируй ее при помощи IDA и посмотри как там что и к чему.
От себя добавлю, что если используешь MSVS, то обрати внимание на инициализацию регистра ECX перед передачей управленния на метод класса.
|
|
|
Записан
|
|
|
|
LP
Помогающий
Offline
|
|
« Ответ #15 : 23-06-2005 14:35 » |
|
А где про это можно почитать У Страустрапа я чтото ничего не могу по этому поводу найти
Про это можно почитать в книге "Inside the C++ object model" by Stan Lippman...
|
|
|
Записан
|
Если эта надпись уменьшается, значит ваш монитор уносят
|
|
|
|