Функция что-то делает и,затем возвращает класс. Возвращаемый класс в коде почти не используется, т.е. вместо Class A=func(); почти везде просто func(); . Ф-я все равно его создает или как-то определяет нужно это или нет? И как то же происходит в инлайн-ф-ях?
Здравствуйте, Аноним, Вы писали:
А>Функция что-то делает и,затем возвращает класс. Возвращаемый класс в коде почти не используется, т.е. вместо Class A=func(); почти везде просто func(); . Ф-я все равно его создает или как-то определяет нужно это или нет? И как то же происходит в инлайн-ф-ях?
"почти" не считается если создание класса есть то, никто его не выкинет. сама функция определить будут использоваться ее результаты или нет — не может. определить использование (принять решение об inline) может JIT компилятор но, на его возможности особо рассчитывать не стоит.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[2]: Создается ли класс, когда он не нужен?
От:
Аноним
Дата:
03.07.07 05:47
Оценка:
Здравствуйте, TK, Вы писали:
(принять решение об inline) может JIT компилятор но, на его возможности особо рассчитывать не стоит.
А я читал, что если IL-код ф-ии менее 15 строк, это ф-я всегда инлайн. Интересно, что она делает в описываемом случае?
Здравствуйте, <Аноним>, Вы писали:
А>Функция что-то делает и,затем возвращает класс. Возвращаемый класс в коде почти не используется, т.е. вместо Class A=func(); почти везде просто func(); . Ф-я все равно его создает или как-то определяет нужно это или нет? И как то же происходит в инлайн-ф-ях?
Класс создается, но раз ссылки на него никуда не сохраняется он будет собран сборщиком мусора. Если функция возвращает объект на пару сотен мегабайт памяти, то имеет смысл написать другую функцию, которая не создает такой громоздкий объект и когда объект не нужен вызывать ее.
Если функция возвращает IDisposable объект, то его нужно задиспозить.
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[2]: Создается ли класс, когда он не нужен?
От:
Аноним
Дата:
03.07.07 13:22
Оценка:
Здравствуйте, _Morpheus_,
Т.е. и в инлайн случае создается? У меня ф-я — пара строк, явно инлайновая. Используется часто. Иногда, редко, желателен возвращаемый класс: экономит чуть-чуть код и все. Если инлайн возвращаемый класс не создает (куда JIT воткнет его код?), все осталяю так. Иначе переписываю.
Здравствуйте, Аноним, Вы писали:
А>Если инлайн возвращаемый класс не создает (куда JIT воткнет его код?)
Туда, где стоит оператор new. Не понимаю, как inline может влиять на это. Вы имеете в виду создание экземпляра класса или что-то другое?
Re[4]: Создается ли класс, когда он не нужен?
От:
Аноним
Дата:
03.07.07 15:47
Оценка:
Здравствуйте, nikov, Вы писали:
N>Туда, где стоит оператор new. Не понимаю, как inline может влиять на это. Вы имеете в виду создание экземпляра класса или что-то другое?
Да я имею в виду новый объект, создаваемый new. И не понимаю почему б компилятору не догадаться, что если некуда передать указатель на объект, во время инлайна, то и создавать его не стоит в этом месте. И инлайн, соответственно, к тому что в одном месте надо сгенерить код создания объекта, в другом не надо. Это ж проще пареной репы и случаи такие часты. Разные алгоритмы других случаев оптимизации, вероятно, бывают сложнее.
Здравствуйте, Аноним, Вы писали:
А>Да я имею в виду новый объект, создаваемый new. И не понимаю почему б компилятору не догадаться, что если некуда передать указатель на объект, во время инлайна, то и создавать его не стоит в этом месте. И инлайн, соответственно, к тому что в одном месте надо сгенерить код создания объекта, в другом не надо. Это ж проще пареной репы и случаи такие часты. Разные алгоритмы других случаев оптимизации, вероятно, бывают сложнее.
потому что при создании объекта выполняется код в конструкторе
Re[6]: Создается ли класс, когда он не нужен?
От:
Аноним
Дата:
03.07.07 16:05
Оценка:
Здравствуйте, IvanDunaev, Вы писали:
ID>потому что при создании объекта выполняется код в конструкторе
Так я и справшиваю, ПОЧЕМУ, ЗАЧЕМ, в инлайн ф-ии выполняется лишний код запуска коструктора, что является тавтологией вопроса зачем создается объект. При отладке, если переменная (объект) не используется, появляется предупреждение, хотя она может модифицироваться. Чего ж во время создания кода, компилятор отключает эту свою функцию для достаточно частых случаев (если отключает — я пока не понял логики).
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, IvanDunaev, Вы писали:
ID>>потому что при создании объекта выполняется код в конструкторе
А>Так я и справшиваю, ПОЧЕМУ, ЗАЧЕМ, в инлайн ф-ии выполняется лишний код запуска коструктора, что является тавтологией вопроса зачем создается объект. При отладке, если переменная (объект) не используется, появляется предупреждение, хотя она может модифицироваться. Чего ж во время создания кода, компилятор отключает эту свою функцию для достаточно частых случаев (если отключает — я пока не понял логики).
во-первых, никаких официальных критериев для инлайна не существует.
во-вторых, нельзя определить, является ли код лишним. формально код в конструкторе может быть произвольным и работать с чем-нибудь глобальным
Здравствуйте, Аноним, Вы писали:
ID>>потому что при создании объекта выполняется код в конструкторе
А>Так я и справшиваю, ПОЧЕМУ, ЗАЧЕМ, в инлайн ф-ии выполняется лишний код запуска коструктора, что является тавтологией вопроса зачем создается объект. А>Чего ж во время создания кода, компилятор отключает эту свою функцию для достаточно частых случаев.
Потому что это достаточно непростой анализ. Код конструктора может сохранять где-либо ссылку на создаваемый объект, делая его достижимым и не подлежащим сборке мусора. Поэтому компилятору приходилось бы заглядывать внутрь кода конструкторов, вызываемых из метода, возвращаемое значение которых игнорируется.
Re[8]: Создается ли класс, когда он не нужен?
От:
Аноним
Дата:
03.07.07 17:16
Оценка:
Здравствуйте, IvanDunaev, Вы писали:
ID>во-первых, никаких официальных критериев для инлайна не существует.
А какая разница компилятору, написаны официальные критерии или их никогда не будет, он все равно иногда встраивает и вот по этим случаям я и задал вопрос.
ID>во-вторых, нельзя определить, является ли код лишним. формально код в конструкторе может быть произвольным и работать с чем-нибудь глобальным
Можно, заглянув в конструктор. И, еще раз, это делается во время отладки.
Re[8]: Создается ли класс, когда он не нужен?
От:
Аноним
Дата:
03.07.07 17:24
Оценка:
Здравствуйте, nikov, Вы писали:
N>Потому что это достаточно непростой анализ. Код конструктора может сохранять где-либо ссылку на создаваемый объект, делая его достижимым и не подлежащим сборке мусора. Поэтому компилятору приходилось бы заглядывать внутрь кода конструкторов, вызываемых из метода, возвращаемое значение которых игнорируется.
Я понял, Вы утверждаете, что алгоритмы распаралеливания кода, попытки его предсказания с расчетом вероятностей ветвления и т.д., (что делается, правда не компилятором а процессором, но делается работа людей, создающих эти алгоритмы), так создание таких алгоритмов проще чем заглянуть в конструктор при компилировании инлайна. Возможно. Но я не вижу сложностей в заглядывании в конструктор. Может приведете одну. Конечно, снижение производительности компиляции, но незначительное: инлайн, кажется, выполняется JIT, и ничего, хотя заглядываний при этом хватает.
Здравствуйте, Аноним, Вы писали:
А>Но я не вижу сложностей в заглядывании в конструктор. Может приведете одну.
Это просто не сделано. Напишите компилятор, в котором устранен этот недостаток.
Создается ли класс, когда он не нужен?
От:
Аноним
Дата:
04.07.07 02:21
Оценка:
Класс создается всегда когда вы пишите new, и компилятор ничего не выкидывет, поскольку не может знать какие глобальные задачи может решать просто созданный класс.
Здравствуйте, <Аноним>, Вы писали:
А>Т.е. и в инлайн случае создается? У меня ф-я — пара строк, явно инлайновая. А>Используется часто. Иногда, редко,
а при чем тут инлайновая/не инлайновая, часто/не часто используется? Может у тебя в конструкторе объекта целая работа происходит и что тогда, из-за того что функция инлайновая компилятор должен выкинуть кусок логики программы?! Если ты написал создание объекта, то объект будет создаваться и не важно часто ты вызываешь этот код или редко...
Здравствуйте, <Аноним>, Вы писали:
ID>>потому что при создании объекта выполняется код в конструкторе
А>Так я и справшиваю, ПОЧЕМУ, ЗАЧЕМ, в инлайн ф-ии выполняется лишний код запуска коструктора
он никак не лишний, раз ты написал что в этом случае нужно создавать объект, значит его нужно создавать. А в конструкторе может быть важный для нормального продолжения работы код и если он не выполнется то приложение упадет, так почему компилятор должен выкидывать код, необходимость выполнить который ты явным образом прописал в программе?!
А> Возможно. Но я не вижу сложностей в заглядывании в конструктор. Может приведете одну. Конечно, снижение производительности компиляции, но незначительное: инлайн, кажется, выполняется JIT, и ничего, хотя заглядываний при этом хватает.
А зря не видишь
Конструктор может быть пустой, но это еще не значит что во время выполнения кода он тоже будет пустой...
Кроме того в конструкторе может производиться создание нового экземпляра этого класса, т.е. рекурсивное создание объектов до поступления какого-либо события — в этом случае заглядывание выльется в зависание и переполнение стека.
Из конструктора также может быть вызвана пара десятков тысяч функций, причем не все могут быть доступны на этапе компиляции. А какаянить из этих функций может цеплять объект к важному списку объектов. Ну и т.д.
Здравствуйте, Аноним, Вы писали:
А>Функция что-то делает и,затем возвращает класс. Возвращаемый класс в коде почти не используется, т.е. вместо Class A=func(); почти везде просто func(); . Ф-я все равно его создает или как-то определяет нужно это или нет? И как то же происходит в инлайн-ф-ях?
А можно посмотреть код? Уж больно заинтересовала меня это ваша функция...
Здравствуйте, <Аноним>, Вы писали:
А>Функция что-то делает и,затем возвращает класс. Возвращаемый класс в коде почти не используется, т.е. вместо Class A=func(); почти везде просто func(); . Ф-я все равно его создает или как-то определяет нужно это или нет? И как то же происходит в инлайн-ф-ях?
Читал. Напрягался, анализировал. Столько ответов, все-таки... А ответ, по-моему, на поверхности: Если ф-ция возвращает объект (по крайней мере разработчик ф-ции так написал), то этот объект обязан быть созданным, независимо от того, как и кто (из стороннего кода) использует этот код.
Этот вопрос подобен вопросу "если я не использую объект, возвращаемый ф-цией, то зачем мне вообще в ф-цию заходить?"
А ф-ция, между прочим, может создавать объекты, которые могут не использоваться внешним (по-отношению к ф-ции) кодом, но могут, уже при своем создании, подключаться к каким-либо ресурсам, выполнять полезную работу... Может ли компилятор просчитать все варианты написания кода? думаю нет. Пусть лучше клиент кода решает свои проблемы с разработчиком кода, не вмешивая компилятор.