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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.12.2011, 17:29   #1
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию Экономия памяти. Что лучше: метод класса или процедура с параметрами... или без разницы?

Добрый день. Возник скорее вот такой философский вопрос
Суть в следующем: есть класс, в нем есть метод(ы). В программе создается множество экземпляров данного класса. Будет ли каждый метод вновь созданного экземпляра занимать память в куче? Может тогда лучше использовать простой метод с параметрами конкретного экземпляра класса? Или это вообще для компилятора не имеет значения?

Пример кода или что лучше:
Код:
type
  MyClass = class
  public
    FCount:integer;
    FName:String;
...
procedure MyClass.DoEtc;
begin
  //действия по работе с FCount и FName... здесь много кода
end;
или

Код:
procedure DoEtc(var FCount:Integer; var FName:String);
begin
  //действия по работе с FCount и FName... здесь этот же громоздкий код
end;
По идее, для каждого экземпляра класса MyClass будет выделяться память и для кода его метода(ов). Но простая процедура DoEtc в коде одна, и при ее вызове идет только обращение по конкретному адресу в памяти с входными указателями на данные того же класса.
Если метод процедурный, то это может сократить расходы памяти... Или я не прав?
"ковыряю изнутри" (с)

Последний раз редактировалось 3D Hunter; 26.12.2011 в 17:32.
3D Hunter вне форума Ответить с цитированием
Старый 26.12.2011, 17:37   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Будет ли каждый метод вновь созданного экземпляра занимать память в куче?

нет.

Несколько байт будет забирать только виртуальный метод. Под VMT, не под код.

> Если метод процедурный, то это может сократить расходы памяти... Или я не прав?

разница между "обычной" процедурой и методом только в том, что в метод передётся Self.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 26.12.2011, 20:45   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Если не ошибаюсь, то размер процедуры/функции определяются только размерами их стёка.

А класс реализует все свои методы и процедуры.

В прочем проверить не сложно =)

Назначте 3 типа:
Код:
   Type
      TSomeProc=procedure;
   type
      TSomeFunc=function:bool;
   type
      tSomeClass=Class
      publc
      procedure DoSome;
      end;
Создайте по экзмемпляру каждого типа, а затем выполните SizeOf для каждего:
http://www.delphibasics.ru/SizeOf.php

Вот ради интереса:
Код:
type
 TSomeProc=procedure (S:Integer);

type
 TSomeFunc=function (S:Integer):Integer;

type
TSomeClass=class

end;


var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  c:TSomeClass;
  f:TSomeFunc;
  p:TSomeProc;
begin
  ShowMessage(IntToStr(SizeOf(TSomeClass)));
  ShowMessage(IntToStr(SizeOf(TSomeProc)));
  ShowMessage(IntToStr(SizeOf(TSomeFunc)));
end;
Все по 4 байта.

Последний раз редактировалось Человек_Борща; 26.12.2011 в 20:54.
Человек_Борща вне форума Ответить с цитированием
Старый 26.12.2011, 22:26   #4
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Человек_Борща, вы тут имеете в виду указатели, а они всегда 4хбайтовые. SizeOf возвращает размер структуры или атомарного типа, а вот касается ли это стека метода?
veniside, т.е. не имеет смысла усложнять жизнь? все в классы?
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 26.12.2011, 22:40   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Если не ошибаюсь, то размер процедуры/функции определяются только размерами их стёка.
ошибаетесь, процедуры не являются объектом или типом данных.
есть лишь указатель на процедуру.
Цитата:
Все по 4 байта.
размер указателя.
Цитата:
veniside, т.е. не имеет смысла усложнять жизнь? все в классы?
нет, не имеет смысла усложнять жизнь.
Цитата:
вы тут имеете в виду указатели, а они всегда 4хбайтовые.
они имеют размер целевой платформы.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 26.12.2011, 22:43   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
veniside, т.е. не имеет смысла усложнять жизнь? все в классы?
Мне кажется нужно в твоем случае задаваться не вопросом ресурсов а вопросом удобств для программиста. Что тебе удобнее функционалка или ООП?
Даже если ты все функции выведешь из класса не оч. много выиграешь в экономии ресурсов.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.12.2011, 22:54   #7
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

понял, спасибо большое за разъяснения! ближе конечно ООП. Значит буду оставлять в классах функционал.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 26.12.2011, 23:23   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Тс, возмите на заметку это: http://www.gunsmoker.ru/2010/08/9897.html
Человек_Борща вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что лучше процедура или функция??? VintProg Общие вопросы Delphi 34 17.08.2010 15:52
Что лучше ВУЗ или самообразование? Dmi3ye Помощь студентам 9 07.12.2009 10:04
Метод класса или внешняя функция? с++ ahab Помощь студентам 4 28.11.2009 19:53
Что лучше assembler или с++? Alabay Помощь студентам 13 11.01.2009 12:21