Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос по static функциям  (Прочитано 11391 раз)
0 Пользователей и 1 Гость смотрят эту тему.
USBLexus
Опытный

ru
Offline 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
Опытный

ru
Offline 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
Опытный

ru
Offline 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
Опытный

ru
Offline 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
Опытный

ru
Offline 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
Опытный

ru
Offline 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
Опытный

ru
Offline 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
Помогающий

ru
Offline Offline

« Ответ #15 : 23-06-2005 14:35 » 

А где про это можно почитать У Страустрапа я чтото ничего не могу по этому поводу найти

Про это можно почитать в книге "Inside the C++ object model" by Stan Lippman...
Записан

Если эта надпись уменьшается, значит ваш монитор уносят
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines