Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

неиспользуемое в классе


ymy1 ©   (2006-10-29 13:36:00) 

Глупый вопрос. Допустим есть у меня некий класс, в котором например десять функций и пять процедур. Я начинаю использовать класс, и буду использовать только три процедуры и пять функций. Компилятор откомпилирует в код все функции и процедуры класса или только используемые?
Спасибо!


Anatoly Podgoretsky   (2006-10-29 17:22:00) [1]

> Ответ на сообщение [4]

> косвенные обращения по индексу
>Что имеется в виду ?

Например обращение в ассемблерном коде [eax+n], раньше в самой RTL таких
кусков было много.


Percent   (2006-10-29 16:32:00) [2]

Я считал что метод - это, как раз функция или процедура.

В ООП нет понятий "процедура" и "функция"...

Оптимизатор удалит только те участки откомпилированного кода, которые однозначно не будут использованы ни при каких условиях*. То же относится и к переменным и прочим возможным излишествам...
Все остальное - оставит.

* Условия ограничены синтаксисом языка Delphi.


guav   (2006-10-29 16:01:00) [3]

> type
> TObj = class(TObject)
> private
>   FA: Integer;
>   FB: Integer;
>   procedure SetA(const Value: Integer);
>   procedure SetB(const Value: Integer);
> public
>   property A: Integer read FA write SetA;
>   property B: Integer read FB write SetB;
> end;

Даже не так можно:
type
 TObj = class(TObject)
 public
   FA: Integer;
   FB: Integer;
   procedure SetA(const Value: Integer);
   procedure SetB(const Value: Integer);
   property A: Integer read FA write SetA;
   property B: Integer read FB write SetB;
 end;

Всё равно SetB и FB будут выброшены.


guav   (2006-10-29 15:53:00) [4]

> [6] DrPass ©   (29.10.06 15:46)
> и кастрированию компоновщиком не подвергается

таки подвергается.

поставь breakpoint в SetB и в рантайме он окажется недействительным, т.к. код SetB выбросится.

program Project2;

{$APPTYPE CONSOLE}

type
 TObj = class(TObject)
 private
   FA: Integer;
   FB: Integer;
   procedure SetA(const Value: Integer);
   procedure SetB(const Value: Integer);
 public
   property A: Integer read FA write SetA;
   property B: Integer read FB write SetB;
 end;

{ TObj }

procedure TObj.SetA(const Value: Integer);
begin
 FA := Value;
end;

procedure TObj.SetB(const Value: Integer);
begin
 FB := Value;
end;

begin
 with TObj.Create do
 try
   A := 0;
 finally
   Free;
 end;
end.


GrayFace   (2006-10-29 15:46:00) [5]

Anatoly Podgoretsky ©   (29.10.06 13:40) [1]
Если функции и процедуры, то выкинет, если методы то нет.

Расшифруйте терминологию, plz. Я считал что метод - это, как раз функция или процедура.

Anatoly Podgoretsky ©   (29.10.06 15:01) [3]
Не забываем про bpl, про косвенные обращения по индексу. Ладно второе
извращение, а с первым то как.

Косвенное обращение по индексу к [u]статическому[/u] методу?


DrPass   (2006-10-29 15:46:00) [6]


> предполагаю что в этом случае выбрасываются только лишние
> private члены

Лишние private-члены выбрасываются оптимизатором в любом случае, о чем он честно пишет ахтунг. В остальном класс - целостная и неделимая структурная единица, и кастрированию компоновщиком не подвергается


guav   (2006-10-29 15:43:00) [7]

> [3] Anatoly Podgoretsky ©   (29.10.06 15:01)
> Не забываем про bpl


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

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

Выбрасывание мне однажды помогло найти ошибку, когда нужные published члены были выброшены. Ошибка была в не-наследовании от TPersistent


> косвенные обращения по индексу

Что имеется в виду ?


Anatoly Podgoretsky   (2006-10-29 15:01:00) [8]

> Ответ на сообщение [2]

Уверен?
Не забываем про bpl, про косвенные обращения по индексу. Ладно второе
извращение, а с первым то как.


guav   (2006-10-29 14:01:00) [9]

> [0] ymy1   (29.10.06 13:36)
Компилируется весь код. Однако, неиспользуемое выбрасываются.
Кроме published членов и не-статических методов, компилятор не может знать, используются ли эти, или нет.


Anatoly Podgoretsky   (2006-10-29 13:40:00) [10]

> Ответ на сообщение [0]

Если функции и процедуры, то выкинет, если методы то нет.


Наверх

Титульная страница Поиск, карта сайта Написать письмо