Re[2]: Создается ли класс, когда он не нужен?
От: _Morpheus_  
Дата: 04.07.07 14:52
Оценка:
Здравствуйте, tol05, Вы писали:

T>Этот вопрос подобен вопросу "если я не использую объект, возвращаемый ф-цией, то зачем мне вообще в ф-цию заходить?"


+1
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[10]: Создается ли класс, когда он не нужен?
От: Аноним  
Дата: 04.07.07 17:21
Оценка:
Здравствуйте, nikov, Вы писали:

N>Это просто не сделано. Напишите компилятор, в котором устранен этот недостаток.


Это обычный компилятор. Когда работает сборщик мусора, он проделывает аналогичную работу, определяя нужен ли где объект. Почему не делать это во время компиляции все равно не понимаю.
А как Вы считаете, если объект не нужен, то указатель на него все равно копируется для передачи из ф-ии?
Re[11]: Создается ли класс, когда он не нужен?
От: _Morpheus_  
Дата: 04.07.07 17:41
Оценка:
Здравствуйте, <Аноним>, Вы писали:

N>>Это просто не сделано. Напишите компилятор, в котором устранен этот недостаток.


А>Это обычный компилятор. Когда работает сборщик мусора, он проделывает аналогичную работу, определяя нужен ли где объект. Почему не делать это во время компиляции все равно не понимаю.

А>А как Вы считаете, если объект не нужен, то указатель на него все равно копируется для передачи из ф-ии?

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

То что ты хочешь это не C#, это уже непредсказуемый язык, на котором напишешь одно, а получишь совершенно другое.


Попробуй скомпилировать такую программу, смысл которой складывать 2+2 и выводить результат:

using System;
using System.Windows.Forms;

public class A
{
    public int X=0;
    public int Y=0;
    
    public void DoWork()
    {
        int result = X+Y;
        MessageBox.Show(X.ToString()+" + "+Y.ToString()+" = "+result.ToString(), "Работа");
    }
}


public class Program
{
    static void Main()
    {
        getInstance();    // вызываем метод который создает и возвращает объект A, но полученный объект никуда не сохраняем
    }

    private static A getInstance()
    {
        A a = new A();
        a.X = 2;
        a.Y = 2;
        a.DoWork();
        return a;
    }
}


а теперь попробуй закоментировать код в методе getInstance это и будет та "оптимизация" которую ты хочешь от компилятора.
И проверь продолжает ли выполнять свою функцию программа или нет
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[10]: Создается ли класс, когда он не нужен?
От: Аноним  
Дата: 04.07.07 18:25
Оценка:
Здравствуйте, _Morpheus_, Вы писали:

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

Не понял, но это не важно. Какая разница пустой не пустой?

_M_>Кроме того в конструкторе может производиться создание нового экземпляра этого класса, т.е. рекурсивное создание объектов до поступления какого-либо события — в этом случае заглядывание выльется в зависание и переполнение стека.


Почему? Он анализирует рекурсивные ф-ии (не уверен, но кажется, иногда заменяя их работу циклом). Он должен только проверить, то что постоянно проверяет сборщик мусора, и проверить это только один раз во время компиляции. Тогда не надо будет делать эту же работу многократно потом.

_M_>Из конструктора также может быть вызвана пара десятков тысяч функций, причем не все могут быть доступны на этапе компиляции. А какаянить из этих функций может цеплять объект к важному списку объектов.Ну и т.д.


А еще в конструкторе могут вызываться ресурсы, создаваться файла, отправляться эсэмэски. Даже и.т.д. может делаться в конструкторе. Ну что? Или ты решил еще больше оптимизировать "объект не нужен — не надо вызывать конструктор (не глядя в него)"

_M_> Здравствуйте, tol05, Вы писали:


_M_>T>Этот вопрос подобен вопросу "если я не использую объект, возвращаемый ф-цией, то зачем мне вообще в ф-цию заходить?"


_M_>+1


Нет, не подобен.
Этот вопрос аналогичен "если все, что делает ф-я не нужно, можно ли ее не вызывать".
Re[2]: Создается ли класс, когда он не нужен?
От: Аноним  
Дата: 04.07.07 18:32
Оценка:
Здравствуйте, andrey.bond, Вы писали:

AB>А можно посмотреть код? Уж больно заинтересовала меня это ваша функция...


ИМХО ф-й которые возвращают значение, но оно редко используется много в фрейморке. К примеру, MessageBox.Show("Test");

Мой код примерно следующий:


 class A : Base
  {
   // поля A
  }
  class B : Base
  {
   // поля B
  }
  class Result
  {
   //поля Result;
  }
  Base reductionBase(ref Base _base1, ref Base _base2)
  {
   // согласованное изменение полей в _base1, _base2 в зависимости от их величин по определенному алгоритму
   // локальные переменные в которых хранятся результаты согласования полей
   return new Result(локальные_переменные_в_которых_хранятся_результаты_согласования_полей);
   //Result, в дальнейшем нужен не всегда
  }
Re[11]: Создается ли класс, когда он не нужен?
От: _Morpheus_  
Дата: 04.07.07 18:43
Оценка:
Здравствуйте, <Аноним>, Вы писали:

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

А>Не понял, но это не важно. Какая разница пустой не пустой?

Большая, может в конструкторе реализован Q3, и в момент создания объекта пользователь может немного расслабиться порезавшись в Q3.
Если объект не будет создаваться то и в кваку пользователь уже не сможет поиграть...

_M_>>Кроме того в конструкторе может производиться создание нового экземпляра этого класса, т.е. рекурсивное создание объектов до поступления какого-либо события — в этом случае заглядывание выльется в зависание и переполнение стека.


А>Почему? Он анализирует рекурсивные ф-ии (не уверен, но кажется, иногда заменяя их работу циклом). Он должен только проверить, то что постоянно проверяет сборщик мусора, и проверить это только один раз во время компиляции. Тогда не надо будет делать эту же работу многократно потом.


потому что завершение рекурсии может зависить от того когда пользователь кнопку нажмет или мышью кликнет, этого компилятор никак не может знать, поэтому анализировать ему нечего.

_M_>>Из конструктора также может быть вызвана пара десятков тысяч функций, причем не все могут быть доступны на этапе компиляции. А какаянить из этих функций может цеплять объект к важному списку объектов.Ну и т.д.


А>А еще в конструкторе могут вызываться ресурсы, создаваться файла, отправляться эсэмэски. Даже и.т.д. может делаться в конструкторе. Ну что? Или ты решил еще больше оптимизировать "объект не нужен — не надо вызывать конструктор (не глядя в него)"


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


_M_>>T>Этот вопрос подобен вопросу "если я не использую объект, возвращаемый ф-цией, то зачем мне вообще в ф-цию заходить?"


_M_>>+1


А>Нет, не подобен.

А>Этот вопрос аналогичен "если все, что делает ф-я не нужно, можно ли ее не вызывать".

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

Короче глупый разговор, компилятор должен делать то что ему написали и соответствовать спецификации, он это делает и соответствует. А функция выбирать от балды какие куски кода заменять на NOP'ы никому не нужна.
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[3]: Создается ли класс, когда он не нужен?
От: _Morpheus_  
Дата: 04.07.07 19:05
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте, andrey.bond, Вы писали:


AB>>А можно посмотреть код? Уж больно заинтересовала меня это ваша функция...


А>ИМХО ф-й которые возвращают значение, но оно редко используется много в фрейморке. К примеру, MessageBox.Show("Test");


А>Мой код примерно следующий:



А>
А>  Base reductionBase(ref Base _base1, ref Base _base2)
А>  {
А>   // согласованное изменение полей в _base1, _base2 в зависимости от их величин по определенному алгоритму
А>   // локальные переменные в которых хранятся результаты согласования полей
А>   return new Result(локальные_переменные_в_которых_хранятся_результаты_согласования_полей);
А>   //Result, в дальнейшем нужен не всегда
А>  }
А>


Если Result тебе не всегда нужен, а создание лишнего экземпляра тебя так беспокоит, я так понял что Result это очень громоздкий объект и его создание занимает много времени. Тогда зачем-же ты его создаешь когда это не нужно?

Сделал бы так:
    public class SmartAndFastReductor
    {
        private class Reductor
        {
            // переменные в которых хранятся результаты согласования полей
        
            public void reductionBase(ref Base _base1, ref Base _base2)
            {
                // согласованное изменение полей в _base1, _base2 в зависимости от их величин по определенному алгоритму
                // вместо локальных переменных используются переменные класса Reductor
            }

            public Base Result { get { return new Result(переменные_класса_Reductor_в_которых_хранятся_результаты_согласования_полей); } }
        }

        public Base ReductionBaseWithResult(ref Base _base1, ref Base _base2)
        {
            Reductor reductor = new Reductor();
            reductor.reductionBase(ref _base1, ref _base2);
            return reductor.Result;                                                    // экземпляр Result будет создаваться только в случае крайней необходимости
        }

        public void ReductionBaseWithoutResult(ref Base _base1, ref Base _base2)
        {
            Reductor reductor = new Reductor();
            reductor.reductionBase(ref _base1, ref _base2);
        }
    }


Когда не нужно создание Result — вызывай ReductionBaseWithoutResult и тогда время не будет тратиться на медленную операцию создания Result...
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[12]: Создается ли класс, когда он не нужен?
От: Аноним  
Дата: 04.07.07 19:11
Оценка:
Здравствуйте, _Morpheus_, Вы писали:

_M_>а теперь попробуй закоментировать код в методе getInstance это и будет та "оптимизация" которую ты хочешь от компилятора.

_M_>И проверь продолжает ли выполнять свою функцию программа или нет

После сообщения от nikov, в котором было указано, что в конструктор надо заглянуть, я с этим согласился (не согласившись, что это трудно). И тебе писал, что нужно заглянуть.
Игры, в которые играют люди, их сдорово формируют. И кто-то тоже сначала играл в дурака, чтоб боялись, — ты много видел таких, которые не доигрались.
Ты предлагаешь игру склероз?
Re[13]: Создается ли класс, когда он не нужен?
От: _Morpheus_  
Дата: 04.07.07 19:17
Оценка:
Здравствуйте, <Аноним>, Вы писали:

_M_>>а теперь попробуй закоментировать код в методе getInstance это и будет та "оптимизация" которую ты хочешь от компилятора.

_M_>>И проверь продолжает ли выполнять свою функцию программа или нет

А>После сообщения от nikov, в котором было указано, что в конструктор надо заглянуть, я с этим согласился (не согласившись, что это трудно). И тебе писал, что нужно заглянуть.

А> Игры, в которые играют люди, их сдорово формируют. И кто-то тоже сначала играл в дурака, чтоб боялись, — ты много видел таких, которые не доигрались.
А> Ты предлагаешь игру склероз?

Во время компиляции конструктор может быть пустым, однако во время выполнения он может оказаться и не пустым... Если компилятор посмотрит в конструктор и решит раз он пустой то объект создавать не нужно и выкинет этот код. То во время выполнения окажется что конструктор не пустой, но код-то уже выкинут и получится что компилятор сделал неправильный код.
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[14]: Создается ли класс, когда он не нужен?
От: Аноним  
Дата: 04.07.07 19:48
Оценка:
Здравствуйте, _Morpheus_, Вы писали:


_M_>Во время компиляции конструктор может быть пустым, однако во время выполнения он может оказаться и не пустым...


Я, к сожалению, таких тонкостей не знал. Не мог бы сказать, как после компиляции пустой конструктор может иметь код. Кажется, какой-то класс, полезный для самомодификации когда-то на форуме упомянался, но затем, был аналогичный вопрос на который не ответили. И платформа (одна из целей), чтоб вирусов не было.
Re[9]: Создается ли класс, когда он не нужен?
От: Sinclair Россия https://github.com/evilguest/
Дата: 05.07.07 08:49
Оценка: +1
Здравствуйте, <Аноним>, Вы писали:
А>Я понял, Вы утверждаете, что алгоритмы распаралеливания кода, попытки его предсказания с расчетом вероятностей ветвления и т.д., (что делается, правда не компилятором а процессором, но делается работа людей, создающих эти алгоритмы), так создание таких алгоритмов проще чем заглянуть в конструктор при компилировании инлайна. Возможно. Но я не вижу сложностей в заглядывании в конструктор.
Я полагаю, это от того, что ты вообще себе слабо представляешь, что такое "заглянуть в конструктор". В подавляющем большинстве случаев доказать отсутствие побочных эффектов не удастся, при этом стоимость попытки доказательства будет чудовищной.
А>Может приведете одну. Конечно, снижение производительности компиляции, но незначительное: инлайн, кажется, выполняется JIT, и ничего, хотя заглядываний при этом хватает.
Там практически нет "заглядываний". Сам код не анализируется, анализируется только сигнатура метода.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[14]: Создается ли класс, когда он не нужен?
От: Lloyd Россия  
Дата: 05.07.07 08:55
Оценка:
Здравствуйте, _Morpheus_, Вы писали:

_M_>Во время компиляции конструктор может быть пустым, однако во время выполнения он может оказаться и не пустым... Если компилятор посмотрит в конструктор и решит раз он пустой то объект создавать не нужно и выкинет этот код. То во время выполнения окажется что конструктор не пустой, но код-то уже выкинут и получится что компилятор сделал неправильный код.


А ты какую компиляцию имеешь в виду: C#-ную или jit?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[15]: Создается ли класс, когда он не нужен?
От: _Morpheus_  
Дата: 05.07.07 09:17
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, _Morpheus_, Вы писали:


_M_>>Во время компиляции конструктор может быть пустым, однако во время выполнения он может оказаться и не пустым... Если компилятор посмотрит в конструктор и решит раз он пустой то объект создавать не нужно и выкинет этот код. То во время выполнения окажется что конструктор не пустой, но код-то уже выкинут и получится что компилятор сделал неправильный код.


L>А ты какую компиляцию имеешь в виду: C#-ную или jit?


C# -> IL
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[16]: Создается ли класс, когда он не нужен?
От: Lloyd Россия  
Дата: 05.07.07 09:24
Оценка:
Здравствуйте, _Morpheus_, Вы писали:

L>>А ты какую компиляцию имеешь в виду: C#-ную или jit?


_M_>C# -> IL


А он говорит о jit-е.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Создается ли класс, когда он не нужен?
От: Аноним  
Дата: 07.07.07 00:16
Оценка:
Думаю вам нечего беспокойться, так как ссылка на объект не сохраняеться, только если вы в конструкторе тела не присваивате какому либо другому объекту.. сборка мусора происходит часто, и мало использованные объекты удаляются мгновенно, но при одном условии если объект занимат не больше 20KB, к таким объектам применяться механизм поколеней. Если объект не содержит массивов и других классов (!), а простые данные, например параметры x и y типа float, разумнее использовать структуры!


Данное сообщение получено с сайта www.gotdotnet.ru
Re[2]: Создается ли класс, когда он не нужен?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 08.07.07 20:05
Оценка:
Здравствуйте, v.vladimir, Вы писали:

VV>Если объект не содержит массивов и других классов (!), а простые данные, например параметры x и y типа float, разумнее использовать структуры!


А так же если объект не использует полиморфизм, не требует реализации интерфейсов (за исключением одного случая), нигде не кастится к object и не имеет большой размер (< нескольких десятков байт).
... << RSDN@Home 1.2.0 alpha rev. 693 on Windows Vista 6.0.6000.0>>
AVK Blog
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.