Re[8]: Я фигею от VB.NET
От: Lexey Россия  
Дата: 24.07.03 10:52
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>>> А что происходит с Value типом.Либо испльзуется старая переменная или каждый раз расширяется (сужается) стек ????


AVK>>Дергается стек


S> Тогда непонятно, почему на данном форуме защищается объявление переменных в цикле.

S>Или это корпоративный стиль программирования.

По моему это уже не раз было сказано:
1) Такое объявление зачастую гораздо нагляднее, чем объявление в начале метода.
2) Это единственный нормальный способ обеспечить вызов конструктора/деструктора локального для цикла объекта.
3) С точки зрения оптимизации этот вариант также предпочтителен. Вынос объявления из цикла делается тривиально оптимизатором, но возможны ситуации, когда такой вынос не просто бесполезен, а очен вреден.
Реальный пример такой ситуации, когда оптимизатор попросту ломает программу, криво вынося переменные наружу, я уже привел.

S> Что лучше за один раз передвинуть вершину стека, или это делать для каждой переменной???


Смотря для чего. По скорости лучше первое, по памяти — второе.
Re[10]: Я фигею от VB.NET
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 24.07.03 10:57
Оценка:
Здравствуйте, migel, Вы писали:

AVK>>Вот именно что максимальный. А всякие Ldxxx и Stxxx никто не отменял

M>ну дык память то не перераспределяется...

А кто говорил про то что память перераспределяется?

M>Как болеется?


Сегодня уже ничего , хотя ничего хорошего
... << RSDN@Home 1.1 beta 1 (np: тихо) >>
AVK Blog
Re[9]: Я фигею от VB.NET
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 24.07.03 11:18
Оценка:
Здравствуйте, Lexey, Вы писали:



S>> Что лучше за один раз передвинуть вершину стека, или это делать для каждой переменной???


L>Смотря для чего. По скорости лучше первое, по памяти — второе.


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

S>> 1) Такое объявление зачастую гораздо нагляднее, чем объявление в начале метода.

S>> 2) Это единственный нормальный способ обеспечить вызов конструктора/деструктора локального для цикла объекта.


Так наверное лучше определить в конструкции цикла, чем в теле цикла, зачем понапрасну дергать стек???

А причем тут конструктор/деструктор и объявление переменной ????
Конструктор вызывай сколько угодно раз, один раз объявив переменную,
Для Деструкторов есть using

И такой код совсем не нагляден. О чем говорит выше приведенный код.

А наглядность это дело вкуса. Главное эффективность и понятность кода.
В принципе на свой вопрос ответ я получил.
и солнце б утром не вставало, когда бы не было меня
Re[3]: Я фигею от VB.NET
От: al Россия  
Дата: 24.07.03 11:27
Оценка:
Здравствуйте, Воронков Василий, Вы писали:


ВВ>Более того, в диалог вывелось бы значение 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#


Re[10]: Я фигею от VB.NET
От: Lexey Россия  
Дата: 24.07.03 11:33
Оценка:
Здравствуйте, 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> А наглядность это дело вкуса. Главное эффективность и понятность кода.


Наглядность это часть понятности. Про эффективность я тоже уже говорил — теоретически, она у локальных объявлений выше.
Re: Я фигею от VB.NET
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 24.07.03 11:37
Оценка:
На всякий случай приведу IL приведенного кода

.method public instance void  Y() cil managed
{
  // Code size       20 (0x14)
  .maxstack  2
  .locals init (int32 V_0,
           int32 V_1)
  IL_0000:  ldc.i4.0
  IL_0001:  stloc.0
  IL_0002:  ldloc.1
  IL_0003:  call       void [mscorlib]System.Console::WriteLine(int32)
  IL_0008:  ldc.i4.s   10
  IL_000a:  stloc.1
  IL_000b:  ldloc.0
  IL_000c:  ldc.i4.1
  IL_000d:  add.ovf
  IL_000e:  stloc.0
  IL_000f:  ldloc.0
  IL_0010:  ldc.i4.3
  IL_0011:  blt.s      IL_0002
  IL_0013:  ret
} // end of method X::Y
... << RSDN@Home 1.1 beta 1 (np: тихо) >>
AVK Blog
Re[11]: Я фигею от VB.NET
От: Gollum Россия  
Дата: 24.07.03 11:39
Оценка:
Здравствуйте, Lexey, Вы писали:

L>Не говорит. Этот код говорит, что MS подложила разработчикам большую свинью, пообещав автоматическую инициализацию value-типов, но реализовав ее в случае VB.NET через задницу. Как уже говорилось, в C# потребуется указать явный инициализатор, после чего все будет работать как надо.


Ну, в Language Referenсe об этом все сказано, так что свиньи никакой нет. "Если ничего не получается — прочитайте, наконец, инструкцию" (с).

Так что нужно инициализировать явно.
... << RSDN@Home 1.1 beta 1 >>
Eugene Agafonov on the .NET

Re[12]: Я фигею от VB.NET
От: Lexey Россия  
Дата: 24.07.03 11:47
Оценка:
Здравствуйте, Gollum, Вы писали:

L>>Не говорит. Этот код говорит, что MS подложила разработчикам большую свинью, пообещав автоматическую инициализацию value-типов, но реализовав ее в случае VB.NET через задницу. Как уже говорилось, в C# потребуется указать явный инициализатор, после чего все будет работать как надо.


G>Ну, в Language Referenсe об этом все сказано, так что свиньи никакой нет. "Если ничего не получается —


Ну да, только тебе не кажется, что это замечание в language reference логически противоречит утверждению об автоматической инициализации переменных?

>прочитайте, наконец, инструкцию" (с).


Всех инструкций не перечитаешь. Некоторые вещи проще делаются на нормальной логике, а тут она слегка отсутствует.
Re[13]: Я фигею от VB.NET
От: Gollum Россия  
Дата: 24.07.03 11:54
Оценка:
Здравствуйте, Lexey, Вы писали:

>>прочитайте, наконец, инструкцию" (с).


L>Всех инструкций не перечитаешь. Некоторые вещи проще делаются на нормальной логике, а тут она слегка отсутствует.


Согласен. Но формально MS упрекнуть не в чем.
... << RSDN@Home 1.1 beta 1 >>
Eugene Agafonov on the .NET

Re[11]: Я фигею от VB.NET
От: migel  
Дата: 24.07.03 11:58
Оценка:
Здравствуйте, AndrewVK, Вы писали:

M>>ну дык память то не перераспределяется...


AVK>А кто говорил про то что память перераспределяется?

Гм наверное я так понял фразу "...стек дергается...", а в IL В месте объявления переменной никаких загрузок в стек не происходит — только по требованию....

AVK>Сегодня уже ничего , хотя ничего хорошего


Выздорваливай.
Re[11]: Я фигею от VB.NET
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 24.07.03 12:04
Оценка:
Здравствуйте, 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С++ но программируя на Паскале можно добиваться очень эффективной компиляции перед которой Ассемблеристы пасуют, но для этого нужно знать как в той или иной ситуации компилятор будет интерпретировать высокоуровневый код.
и солнце б утром не вставало, когда бы не было меня
Re[2]: Я фигею от VB.NET
От: migel  
Дата: 24.07.03 12:37
Оценка:
Здравствуйте, 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
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.