Несколько вопросов про память

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Alprog
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 127
Зарегистрирован: 15.05.2008 (Чт) 14:21
Откуда: Владивосток

Несколько вопросов про память

Сообщение Alprog » 30.07.2008 (Ср) 13:49

Разрешите поинтересоваться, в целях повышения образованности :lol:

:?: Есть класс, в нём есть глобальные переменные
стандартного типа, например, Long. Когда под них выделяется память: в момент создания экземпляра класса или в момент первого использования этой переменной?

:?: Выделяется ли память при объявлении переменной объектного типа:
Код: Выделить всё
Dim A As Object

Dim B as Class1

Если да, то сколько?

:?: Содержит ли объект что-нибудь кроме ссылки на Vtbl и собственных данных?

:?: Есть ли возможность добавить глобальные переменные динамически? ReDim не считается. Нужен не массив, а именно переменная.

:?: Можно ли для глобальной секции класса написать условие, при котором бы объявлялись или не объявлялись те или иные данные?
Вроде #, но чтобы проверки повторялись при выполнении, а не только при компиляции.
Последний раз редактировалось Alprog 30.07.2008 (Ср) 14:13, всего редактировалось 1 раз.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 30.07.2008 (Ср) 14:06

Ни в том, ни в другом случае объект не создается.
Он будет создан только после New.
Lasciate ogni speranza, voi ch'entrate.

Alprog
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 127
Зарегистрирован: 15.05.2008 (Чт) 14:21
Откуда: Владивосток

Сообщение Alprog » 30.07.2008 (Ср) 14:22

Ни в том, ни в другом случае объект не создается.

Я так понимаю это ответ на второй вопрос. Стало быть запись "Dim B as Class1" нужна только разработчику для автодополнения... но ведь компилятор не игнорирует эту строку (получаются разные exe), значит что-то же всё-равно происходит :?

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 30.07.2008 (Ср) 14:25

Есть класс, в нём есть глобальные переменные
В классе не может быть глобальных переменных, все переменые класса локальны для этого класса.
Когда под них выделяется память: в момент создания экземпляра класса или в момент первого использования этой переменной?
Если таки имеется ввиду приватная переменная, хранящая значение для публичного свойства, то момент создания экземпляра класса = момент первого использования этой переменной.
Если да, то сколько?
Сколько надо. Класс может содержать произвольное число приватных переменных, алкающих памяти, информацию о которых никак не получить. А еще может содержать ссылки на другие объекты, которые тоже хотят урвать свой кусок...
Есть ли возможность добавить глобальные переменные динамически?
Нет.
Лучший способ понять что-то самому — объяснить это другому.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 30.07.2008 (Ср) 14:31

Alprog писал(а):
Ни в том, ни в другом случае объект не создается.

Я так понимаю это ответ на второй вопрос. Стало быть запись "Dim B as Class1" нужна только разработчику для автодополнения... но ведь компилятор не игнорирует эту строку (получаются разные exe), значит что-то же всё-равно происходит :?
Происходит описание того, какой интерфейс нужно будет получить из объекта, когда он все-таки будет создан.
Лучший способ понять что-то самому — объяснить это другому.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 30.07.2008 (Ср) 14:46

Происходит описание того, какой интерфейс нужно будет получить из объекта, когда он все-таки будет создан.
Ну и все таки выделяется 4 байта в структуре объекта под хранение сабжа.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 30.07.2008 (Ср) 14:48

Есть класс, в нём есть глобальные переменные

Их в нём, таки, как уже сказали, нет.

Когда под них выделяется память: в момент создания экземпляра класса или в момент первого использования этой переменной?

В момент создания экземпляра происходит выделение. "Первое использование" здесь вообще ни к чему. В принципе, оно косвенно может здесь появиться только под одной причине: у DAN-ссылок создания экземпляра происходит при первом использовании DAN-ссылки в контекте БК для этой ссылки, если ссылка сброшена.

Выделяется ли память при объявлении переменной объектного типа:
Dim A As Object

Dim B as Class1

Если да, то сколько?

4 байта на каждую под указатель.

Содержит ли объект что-нибудь кроме ссылки на Vtbl и собственных данных?

Не регламентируется. Зависит от самого объекта, вернее от того, как его констрирует конструктор.

Есть ли возможность добавить глобальные переменные динамически? ReDim не считается. Нужен не массив, а именно переменная.

1) Куда добавить?
2) Как ты к ним будешь обращаться?


Можно ли для глобальной секции класса написать условие, при котором бы объявлялись или не объявлялись те или иные данные?
Вроде #, но чтобы проверки повторялись при выполнении, а не только при компиляции

Нет.


Стало быть запись "Dim B as Class1" нужна только разработчику для автодополнения... но ведь компилятор не игнорирует эту строку (получаются разные exe), значит что-то же всё-равно происходит

Эта строчка нужна компилятору в первую очередь. И нужна она ему, чтобы знать, что такое B, и во что компилировать обращения к B.


Antonariy
то момент создания экземпляра класса = момент первого использования этой переменной.

Не правильно говоришь. Момент создания класса — момент использования оператора New, или момент первого обращения (любого) к DAN-ссылке, если та сброшена.


Если да, то сколько?
Сколько надо. Класс может содержать произвольное число приватных переменных, алкающих памяти, информацию о которых никак не получить. А еще может содержать ссылки на другие объекты, которые тоже хотят урвать свой кусок...

Т.к. "сколько" относилось к локальным переменным какой-то процедуры, то этот ответ тоже неверный.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 30.07.2008 (Ср) 15:15

Не правильно говоришь.
Я не говорю, что объект (а не класс, кстати) создается при (в результате) использовании(я) переменной. Я имею ввиду, что в фразе "в момент создания экземпляра класса или в момент первого использования этой переменной" союз "или" неприменим. До создания объекта этой переменной нет. При создании объекта память выделяется, что в принципе можно считать первым использованием этой переменной - Long'у присваивается значение 0.
Т.к. "сколько" относилось к локальным переменным какой-то процедуры, то этот ответ тоже неверный.
Принимается. Я продумал не про объявление, а про создание объекта.
Лучший способ понять что-то самому — объяснить это другому.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 30.07.2008 (Ср) 15:21

Antonariy
Я не говорю, что объект (а не класс, кстати) создается при (в результате) использовании(я) переменной. Я имею ввиду, что в фразе "в момент создания экземпляра класса или в момент первого использования этой переменной" союз "или" неприменим. До создания объекта этой переменной нет. При создании объекта память выделяется, что в принципе можно считать первым использованием этой переменной - Long'у присваивается значение 0.


Тогда так: ты имел в виду под "этой переменной" Long-овый мембер класса, а я — DAN-ссылку.

P.S. DAN-ссылка — cсылка, объявленная As New.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Alprog
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 127
Зарегистрирован: 15.05.2008 (Чт) 14:21
Откуда: Владивосток

Сообщение Alprog » 30.07.2008 (Ср) 15:31

Глобальными я по незнанию везде называл данные класса.
Просто я решил, что раз они доступны из любой функции класса, то они являются для них глобальными.

Но спасибо за ответы, чуть-чуть яснее стал понимать происходящее в VB.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 30.07.2008 (Ср) 15:35

Они называются не глобальные, а публичные.
Глобальные могут быть только в модуле.
Lasciate ogni speranza, voi ch'entrate.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 30.07.2008 (Ср) 15:38

Alprog писал(а):Глобальными я по незнанию везде называл данные класса.
Просто я решил, что раз они доступны из любой функции класса, то они являются для них глобальными.
Они могут быть как Публичными/Открытыми если объявлены как Public, либо закрытыми/приватными, если объявлены ка Private. Первые видны за пределами экземпляра класса (через ссулку на класс), вторые только внутри экземпляра класса.
Весь мир матрица, а мы в нем потоки байтов!


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot, Yandex-бот и гости: 54

    TopList