Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.11.2010, 16:26   #11
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Пепел Феникса Советую сборщик мусора сделать как в Objective C. На основе подсчета ссылок, чем то похожее на COM в Windows.

1. objectOfClass: alloc - выделить память под класс и установить счетчик ссылок в 1
2. objectOfClass: retain - увеличить счетчик на 1
3. objectOfClass: release - уменьшить счетчик на 1, если счетчик равен 0 - освободить место объекта класса
4. objectOfClass: autorelease - если объект создается только для использования в одной функции (или в логическом блоке begin end; { }), то при вызове alloc после добавляется доп. поле autorelease которое говорит о том, что по сути после окончания блока/функции будет автоматически вызван метод release, что по сути освободит объект

Это очень удобно, т.к. каждый модуль/класс может захватить объект и увеличить ссылку в нем, и данный модуль будет уверен что объект существует пока он сам его не освободит. Это удобно для глобальных объектов к примеру.

Что еще понравилось в Objective C, так это то, что методы = сообщения. Логика в том, что можно к примеру сделать так null->release(); это по сути абсурд, т.к. объект уже не существует, а мы вызываем метод у объекта. Т.к. метод = сообщение, то мы попросту пошлем сообщение null'у чтобы тот вызвал release, но т.к. это null сообщение просто про игнорируется, и не будет ошибки.


Конечно это мое мнение что, данный подход очень удобен и дает сразу и сборщик мусора и более менее контроль над памятью.


p.s. хм, может и мне что то подобное навязать как гос экзамен в универе, если можно конечно такое провернуть.
BOBAH13 вне форума Ответить с цитированием
Старый 12.11.2010, 22:04   #12
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Пепел Феникса Советую сборщик мусора сделать как в Objective C. На основе подсчета ссылок, чем то похожее на COM в Windows.
Не писал на Objective C и потому не знаю как там с реализацией (может таких проблем и нет и как-то они обходятся). Так вот у подсчета ссылок есть одно мелкое неприятное, но чреватое утечками уязвимое место: циклические ссылки. Если объект а ссылается на объект б, а тот в свою очередь на объект а, то ничего не удалится. При этом зависимость совершенно не обязана быть прямой. а хранит указатель на в, тот в свою очередь на г и т.д. в итоге через кучу "посредников" получаем зависимость от объекта б, т.е. эту штуку трудно найти.
Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Что еще понравилось в Objective C, так это то, что методы = сообщения. Логика в том, что можно к примеру сделать так null->release(); это по сути абсурд, т.к. объект уже не существует, а мы вызываем метод у объекта. Т.к. метод = сообщение, то мы попросту пошлем сообщение null'у чтобы тот вызвал release, но т.к. это null сообщение просто про игнорируется, и не будет ошибки.
Не скажу, что это плюс. Мне лично ближе к телу вылетающая ошибка (не люблю когда что-то втихую не работает, но делает вид, что работает). Но тут вопрос не "правильно" или "неправильно", а кому что больше нравится. Эта штука должна продумываться изначально и пропитывать весь язык, чтобы весь код следовал одним принципам и не получилась каша, что вот тут мы ошибку выбрасываем, а тут молча проглатываем.
pu4koff вне форума Ответить с цитированием
Старый 12.11.2010, 22:11   #13
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
...у подсчета ссылок есть одно мелкое неприятное, но чреватое утечками уязвимое место: циклические ссылки....
Трудно представить где такое понадобится ведь все есть объект, а ссылка есть ссылка. Зачем ссылка на ссылку? если нужна копия объекта, object retain. И все дела.

На счет сообщений имелось ввиду, что к примеру
Код:
if (!object) delete object;
намного опаснее, чем
Код:
[object release];
почему опаснее? ну то что object может быть не NULL, но и не существовать уже в памяти. А во втором случае, Obj C, хоть nil и существует или нет, все будет работать гладко. Да и в принципе какой язык разницы нет, все равно правило для нас всегда есть, следить за памятью, в том числе и объектами.

По крайней мере мне это важно, т.к. каждый класс, особенной описывающий форму/вьюшку/контрол/темплейт всегда имеет кучу объектов которые создаются в конструкторе и уничтожаются в деструкторе.

Имел дело с object pascal, c++, c# и objective c. Больше всего понравился по языку Objective C вот и предлагаю явные для меня плюсы.
BOBAH13 вне форума Ответить с цитированием
Старый 12.11.2010, 22:47   #14
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Цитата:
Цитата:
т.е. компилятор совершенно ничего не знает о типах? Даже элементарный int будет реализован каким-то образом на этом самом языке?
ну в общем то, так.
Т.е. у нас быдет просто какой-то файл, в котором будет написанно сколькоп амяти надо под каждый тип данных и подппрограммы для работы с нимим (сложение, умножение, и т.п.) ?

Цитата:
Мне лично ближе к телу вылетающая ошибка (не люблю когда что-то втихую не работает, но делает вид, что работает)
По мне, лучше в таких местах ставить именно исключения, стандартный обработчик которого "втихую работает".
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс

Последний раз редактировалось ROD; 12.11.2010 в 22:49.
ROD вне форума Ответить с цитированием
Старый 12.11.2010, 22:48   #15
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Трудно представить где такое понадобится ведь все есть объект, а ссылка есть ссылка. Зачем ссылка на ссылку? если нужна копия объекта, object retain. И все дела.
Кнопка хранит ссылку на форму, на которой она находится. В то же время форма хранит в себе список расположенных на ней кнопок. Итог: ни форма, ни кнопки никогда не будут удалены из памяти (форма нужна кнопкам, кнопки нужны форме). На деле такая зависимость может проявиться в иерархии из N классов и не так легко будет просматриваться.
pu4koff вне форума Ответить с цитированием
Старый 12.11.2010, 23:51   #16
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

pu4koff, такое должно удалятся вообще чуть иначе.
то есть
Код:
Button->Delete()
{
    Parent->Delete(Button);//найдет и уберет в своем списке Button, счетчик уменьшится.
    Release();//уменьшаем счетчик, и удаляем если 0
}
но тут проблема в том, если ктото удержал ссылку на кнопку...
Цитата:
На основе подсчета ссылок, чем то похожее на COM в Windows.
мог не обьяснять, я этот метод в С++ юзаю и сейчас(в своей либке)
ну а так согласен, метод хороший
Цитата:
Т.е. у нас быдет просто какой-то файл, в котором будет написанно сколькоп амяти надо под каждый тип данных и подппрограммы для работы с нимим (сложение, умножение, и т.п.) ?
ну в принципе да.

кстати, а в С++:
Код:
class A
{
    int d;
    A& operator+(int i)
   {
       A* t=new A();
       (*t)+=i;
      return t;
    }
    A& operator+=(int i)
    {
        d+=i;
    }
};

A b;

b=b+4;
не будет утечки памяти?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 12.11.2010 в 23:56.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.11.2010, 06:29   #17
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
По умолчанию

Извените что не в тему где можно найти нормальное описание структуры EXE?
VintProg вне форума Ответить с цитированием
Старый 13.11.2010, 06:30   #18
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
pu4koff, такое должно удалятся вообще чуть иначе.
Для подхода с подсчетом ссылок этот случай достаточно проблематичен. Поэтому я про него и упомянул.
Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
но тут проблема в том, если ктото удержал ссылку на кнопку...
Ну как проблема... форму уже удалили за ненадобностью, а кнопку - нет. В итоге кнопка ссылается непонятно на что и существует непонятно зачем (зачем нам кнопка без формы?).
Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
кстати, а в С++:
...
не будет утечки памяти?
new есть. delete - нет. Значит утечка будет.
pu4koff вне форума Ответить с цитированием
Старый 13.11.2010, 08:25   #19
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Кнопка хранит ссылку на форму, на которой она находится. В то же время форма хранит в себе список расположенных на ней кнопок. Итог: ни форма, ни кнопки никогда не будут удалены из памяти (форма нужна кнопкам, кнопки нужны форме). На деле такая зависимость может проявиться в иерархии из N классов и не так легко будет просматриваться.
Вы не много не поняли идею. Форма - имеет ссылку на кнопку и при создании делает alloc (счетчик = 1), код имеет ссылку на эту же кнопку, при инициализации формы делает кнопка retain. После чего счетчик = 2. В данный момент форма и код ссылаются на один и тот же объект. Код, деинициализация, кнопка release. Форма разрушение - release. Счетчик = 0, кнопка уничтожена.

На счет списка, одно дело просто хранить ссылку(указатель, адрес) на кнопку в списке каком либо, другое дело вызывать retain что увеличит счетчик объекта. Не путайте.

Ну да ладно, видимо я уже опоздал с предложением автору. Автор, вы со своей темой меня поджигаете уже сам хочу попробовать подобное сделать.

А вот вопрос, это язык компилируемый я так понимаю? Вы в итоге напишите интерпретатор который будет переводить ваш код(язык) в asm, а потом используя какой либо asm компилятор компилировать уже в бинарный код? Или идея в чем то другом?
BOBAH13 вне форума Ответить с цитированием
Старый 13.11.2010, 09:09   #20
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Вы не много не поняли идею. Форма - имеет ссылку на кнопку и при создании делает alloc (счетчик = 1), код имеет ссылку на эту же кнопку, при инициализации формы делает кнопка retain. После чего счетчик = 2. В данный момент форма и код ссылаются на один и тот же объект. Код, деинициализация, кнопка release. Форма разрушение - release. Счетчик = 0, кнопка уничтожена.

На счет списка, одно дело просто хранить ссылку(указатель, адрес) на кнопку в списке каком либо, другое дело вызывать retain что увеличит счетчик объекта. Не путайте.
Может конечно я туплю, но не понимаю идею всё равно.
Кнопка нужна форме, следовательно счетчик + 1. Форма нужна кнопке - следовательно счетчик + 1. Получаем, что форма не может удалиться, т.к. её счетчик равен 1 и та же ситуация с кнопкой.
Если я буду хранить список кнопок формы без увеличения счетчиков, то они соберутся сборщиком и волшебным образом пропадут с экрана на глазах у удивленного пользователя.
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
можно ли подобный текст перевести на человеческий язык? alexxx777 Помощь студентам 0 24.05.2010 19:56
Как создать вид подобный SolidWorks. KemanSR Общие вопросы C/C++ 6 04.05.2010 21:30
Добавить модуль в phpnuke-подобный движок Able2Know Фриланс 3 23.04.2010 16:29
В Access есть тип данных "Счетчик".Есть ли подобный тип данных в MS Sql Server 2000? An_ton SQL, базы данных 5 16.01.2009 17:55