Здравствуйте, Serginio1, Вы писали:
S>>> А что происходит с Value типом.Либо испльзуется старая переменная или каждый раз расширяется (сужается) стек ????
AVK>>Дергается стек
S> Тогда непонятно, почему на данном форуме защищается объявление переменных в цикле. S>Или это корпоративный стиль программирования.
По моему это уже не раз было сказано:
1) Такое объявление зачастую гораздо нагляднее, чем объявление в начале метода.
2) Это единственный нормальный способ обеспечить вызов конструктора/деструктора локального для цикла объекта.
3) С точки зрения оптимизации этот вариант также предпочтителен. Вынос объявления из цикла делается тривиально оптимизатором, но возможны ситуации, когда такой вынос не просто бесполезен, а очен вреден.
Реальный пример такой ситуации, когда оптимизатор попросту ломает программу, криво вынося переменные наружу, я уже привел.
S> Что лучше за один раз передвинуть вершину стека, или это делать для каждой переменной???
Смотря для чего. По скорости лучше первое, по памяти — второе.
S>> Что лучше за один раз передвинуть вершину стека, или это делать для каждой переменной???
L>Смотря для чего. По скорости лучше первое, по памяти — второе.
Под стек память уже выделна и можно говорить только о переполнении стека, что случается очень редко и такие ситуации можно предусмотреть заранее.
S>> 1) Такое объявление зачастую гораздо нагляднее, чем объявление в начале метода. S>> 2) Это единственный нормальный способ обеспечить вызов конструктора/деструктора локального для цикла объекта.
Так наверное лучше определить в конструкции цикла, чем в теле цикла, зачем понапрасну дергать стек???
А причем тут конструктор/деструктор и объявление переменной ????
Конструктор вызывай сколько угодно раз, один раз объявив переменную,
Для Деструкторов есть using
И такой код совсем не нагляден. О чем говорит выше приведенный код.
А наглядность это дело вкуса. Главное эффективность и понятность кода.
В принципе на свой вопрос ответ я получил.
и солнце б утром не вставало, когда бы не было меня
ВВ>Более того, в диалог вывелось бы значение 3. В VB.NET же такой код просто не скомпилируется, так как там действительно используется с-подобная модель видимости переменных. Однако приведенный выше пример ее полностью нарушает. Таким образом, получается, что частично что-то переделали, а старые хвосты все же остались. Так что есть от чего фигеть на самом деле.
Так все дело в том, что в Вашем случае компилятор сообщит об ошибке, и при необходимости программист вынесет объявление переменной из блока if. А в начальном примере компилятор не увидит ничего криминального, но если он просто так изменит поведение программы с VB6 на C#-подобное, то это будет не правильно. Между прочем, если использовать объявление в стиле VB.Net
Dim ii As Integer = 0
Do
Dim j As Integer = 0
Console.WriteLine(j)
j = 10
ii += 1
Loop While ii < 3
то аоведение прогрммы меняется, и мы получаем три нуля, как в C#
Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, Lexey, Вы писали:
S>>> Что лучше за один раз передвинуть вершину стека, или это делать для каждой переменной???
L>>Смотря для чего. По скорости лучше первое, по памяти — второе.
S>Под стек память уже выделна и можно говорить только о переполнении стека, что случается очень редко и
Зарезервирована != используется. Использование еще может потребовать дополнительного commit'а страниц, а это далеко не бесплатная операция.
такие ситуации можно предусмотреть заранее.
Такие ситуации далеко не всегда можно предусмотреть заранее. Пример я приводил. Код совершенно корректен, а результат — нет.
S>>> 1) Такое объявление зачастую гораздо нагляднее, чем объявление в начале метода. S>>> 2) Это единственный нормальный способ обеспечить вызов конструктора/деструктора локального для цикла объекта.
S> Так наверное лучше определить в конструкции цикла, чем в теле цикла, зачем понапрасну дергать стек???
В смысле в for? Не канает, т.к. это почти равносильно объявлению вне цикла (кроме области видимости).
S> А причем тут конструктор/деструктор и объявление переменной ???? S> Конструктор вызывай сколько угодно раз, один раз объявив переменную, S>Для Деструкторов есть using
Я вообще-то не привязывался к дотнету. В C++ конструктор вызывается ровно один раз, равно как и деструктор.
S> И такой код совсем не нагляден. О чем говорит выше приведенный код.
Не говорит. Этот код говорит, что MS подложила разработчикам большую свинью, пообещав автоматическую инициализацию value-типов, но реализовав ее в случае VB.NET через задницу. Как уже говорилось, в C# потребуется указать явный инициализатор, после чего все будет работать как надо.
S> А наглядность это дело вкуса. Главное эффективность и понятность кода.
Наглядность это часть понятности. Про эффективность я тоже уже говорил — теоретически, она у локальных объявлений выше.
Здравствуйте, Lexey, Вы писали:
L>Не говорит. Этот код говорит, что MS подложила разработчикам большую свинью, пообещав автоматическую инициализацию value-типов, но реализовав ее в случае VB.NET через задницу. Как уже говорилось, в C# потребуется указать явный инициализатор, после чего все будет работать как надо.
Ну, в Language Referenсe об этом все сказано, так что свиньи никакой нет. "Если ничего не получается — прочитайте, наконец, инструкцию" (с).
Здравствуйте, Gollum, Вы писали:
L>>Не говорит. Этот код говорит, что MS подложила разработчикам большую свинью, пообещав автоматическую инициализацию value-типов, но реализовав ее в случае VB.NET через задницу. Как уже говорилось, в C# потребуется указать явный инициализатор, после чего все будет работать как надо.
G>Ну, в Language Referenсe об этом все сказано, так что свиньи никакой нет. "Если ничего не получается —
Ну да, только тебе не кажется, что это замечание в language reference логически противоречит утверждению об автоматической инициализации переменных?
>прочитайте, наконец, инструкцию" (с).
Всех инструкций не перечитаешь. Некоторые вещи проще делаются на нормальной логике, а тут она слегка отсутствует.
Здравствуйте, Lexey, Вы писали:
>>прочитайте, наконец, инструкцию" (с).
L>Всех инструкций не перечитаешь. Некоторые вещи проще делаются на нормальной логике, а тут она слегка отсутствует.
Здравствуйте, AndrewVK, Вы писали:
M>>ну дык память то не перераспределяется...
AVK>А кто говорил про то что память перераспределяется?
Гм наверное я так понял фразу "...стек дергается...", а в IL В месте объявления переменной никаких загрузок в стек не происходит — только по требованию....
AVK>Сегодня уже ничего , хотя ничего хорошего
Здравствуйте, Lexey, Вы писали:
L>Здравствуйте, Serginio1, Вы писали:
S>>Здравствуйте, Lexey, Вы писали:
S>>>> Что лучше за один раз передвинуть вершину стека, или это делать для каждой переменной???
L>>>Смотря для чего. По скорости лучше первое, по памяти — второе.
S>>Под стек память уже выделна и можно говорить только о переполнении стека, что случается очень редко и
L>Зарезервирована != используется. Использование еще может потребовать дополнительного commit'а страниц, а это далеко не бесплатная операция.
Дополнительный commit потребуется при выделении следующей страницы, а она возникает не часто, тем более учитывая, что декомит возникает редко, чай памяти достаточно. А эффективность выше.
L>такие ситуации можно предусмотреть заранее.
S>>>> 1) Такое объявление зачастую гораздо нагляднее, чем объявление в начале метода. S>>>> 2) Это единственный нормальный способ обеспечить вызов конструктора/деструктора локального для цикла объекта.
S>> Так наверное лучше определить в конструкции цикла, чем в теле цикла, зачем понапрасну дергать стек???
L>В смысле в for? Не канает, т.к. это почти равносильно объявлению вне цикла (кроме области видимости).
Обычно переменные использующиеся в циклах запихиваются в регистры, и в данном случае не важно где их объявлять.
S>> А причем тут конструктор/деструктор и объявление переменной ???? S>> Конструктор вызывай сколько угодно раз, один раз объявив переменную, S>>Для Деструкторов есть using
L>Я вообще-то не привязывался к дотнету. В C++ конструктор вызывается ровно один раз, равно как и деструктор.
В Delphi для переменной вызывай конструктор, деструктор сколько дуще угодно.
L>Наглядность это часть понятности.
Для меня лично абсолютно непонятен смысл объявления переменных в цикле, прежде всего на физическом уровне. В данный момент, ситуация прояснилась.
Много говорилось об оптимизации компилятора, то желательно знать и предугадывать действия компилятора и кодировать оптимальный код. Хотя Delphi и не VС++ но программируя на Паскале можно добиваться очень эффективной компиляции перед которой Ассемблеристы пасуют, но для этого нужно знать как в той или иной ситуации компилятор будет интерпретировать высокоуровневый код.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, AndrewVK, Вы писали:
AVK>На всякий случай приведу IL приведенного кода
AVK>
AVK>.method public instance void Y() cil managed
AVK>{
AVK> // Code size 20 (0x14)
AVK> .maxstack 2
AVK> .locals init (int32 V_0,
AVK> int32 V_1)// Вот это то и есть установка дефолтного значения
IL_0000: ldc.i4.0
IL_0001: stloc.0
....
// по хорошему же конечно надо было бы blt.s IL_0000
IL_0011: blt.s IL_0002