Здравствуйте, nob114, Вы писали:
N>Kto ge peremnnuu vnutri tsikla objavlyaet ??? Objavite gde to eshe — a vistavit' mogno i v tsikle. Definitely buggy code.
в этом то и весь кайф что можно внутри цикла объявить в нете, а по окончании цикла убъется она
но в данном случае использование было некорректным
Здравствуйте, nob114, Вы писали:
N>Kto ge peremnnuu vnutri tsikla objavlyaet ??? Objavite gde to eshe — a vistavit' mogno i v tsikle. Definitely buggy code.
В нормальных языках нормальные люди переменные объявляют по месту использования, в том числе и внутри циклов.
Здравствуйте, Lexey, Вы писали:
L>В нормальных языках нормальные люди переменные объявляют по месту использования, в том числе и внутри циклов.
Я еще понимаю объявление переменных внутри объявления цикла, т.к. они будут сидеть в регистрах а не в стеке, но когда объявляют в середине кода, и начинаешь искать ее объявление начинаешь ....
Конечно дело вкуса, но мне нравится паскалевский подход.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
L>>В нормальных языках нормальные люди переменные объявляют по месту использования, в том числе и внутри циклов.
S> Я еще понимаю объявление переменных внутри объявления цикла, т.к. они будут сидеть в регистрах а не в стеке, но когда объявляют в середине кода, и начинаешь искать ее объявление начинаешь ....
1) Когда нужно лезть в начало функции, чтобы увидеть объявление переменной — это ничуть не лучше, а в большинстве случаев гораздо хуже, т.к. в этом случае в месте объявления смысл переменной попросту непонятен.
2) Объявление по месту, в теории, позволяет компилятору генерировать более эффективный код.
S> Конечно дело вкуса, но мне нравится паскалевский подход.
У нас правило объявления переменной непосредственно перед началом ее использования внесено в корпоративный стандарт кодирования, и в данном случае я с ним полностью солидарен.
>хуже, т.к. в этом случае в месте объявления смысл переменной попросту непонятен. L>2) Объявление по месту, в теории, позволяет компилятору генерировать более эффективный код.
зависит от реализации компилятора. если объявление переменной в цикле заставляет модифицировать фрейм стека
при каждом проходе это наоборот замедляет код. интересно как в этом случае поступает .NET — в скомпилированном коде
объявление будет вынесено за цикл?
Здравствуйте, Awaken, Вы писали:
A>зависит от реализации компилятора. если объявление переменной в цикле заставляет модифицировать фрейм стека A>при каждом проходе это наоборот замедляет код. интересно как в этом случае поступает .NET — в скомпилированном коде A>объявление будет вынесено за цикл?
Будет, будет в IL Переменные обявляються в самом начале метода...
Просто компилятор басика не делает код активации в начале области видимости переменной
Здравствуйте, Lexey, Вы писали:
L>2) Объявление по месту, в теории, позволяет компилятору генерировать более эффективный код.
Если переменные сидят в стеке, то какую либо оптимизацию получить сложно, тем более, что компилятору нужно следить за размещение в стеке, в отличии от объявления переменных внутри одной секции, т.к сразу определяется нужный размер стека под переменные.
Исключение составляют переменные циклов. L>У нас правило объявления переменной непосредственно перед началом ее использования внесено в корпоративный стандарт кодирования, и в данном случае я с ним полностью солидарен.
Все зависит от длины куска кода, где применяется переменная, если небольшой вполне приемлемо, иначе....
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Awaken, Вы писали:
>>хуже, т.к. в этом случае в месте объявления смысл переменной попросту непонятен. L>>2) Объявление по месту, в теории, позволяет компилятору генерировать более эффективный код.
A>зависит от реализации компилятора. если объявление переменной в цикле заставляет модифицировать фрейм стека
Естественно. Только вынести объявление всегда можно, а вот внести гораздо сложнее. А локальное объявление, по идее, позволяет один раз зарезервировать память под множество однотипных временных переменных. Только вот VC с этим успешно не справляется.
[]
M>Просто компилятор басика не делает код активации в начале области видимости переменной
Это что значит?
Конструктор размерного типа-то вызывается!
Получается интересная картина: если объявлять переменную с помощью New, для нее конструктор вызывается каждый раз в цикле. Это касается и встроеных типов, типа integer.
Например,
Structure s
Public i as Integer
Public Sub New(j as Integer)
End Sub
End Structure
...
Dim i as Integer
Do
Dim j as Integer
Dim t as s
Dim tt as s(20)
WriteLine(j)
WriteLine(t.i)
WriteLine(tt.i)
j = 10
t.i = 100
tt.i = 200
Loop while i < 3
Здравствуйте, Alexey Shirshov, Вы писали:
AS>Здравствуйте, migel, Вы писали:
AS>[]
M>>Просто компилятор басика не делает код активации в начале области видимости переменной
AS>Это что значит? AS>Конструктор размерного типа-то вызывается! AS>Получается интересная картина: если объявлять переменную с помощью New, для нее конструктор вызывается каждый раз в цикле. Это касается и встроеных типов, типа integer.
Вот и получается что инициализация объекта не происходит при повторном входе в область видимости
Ne proshe li initsializirovat' ee s predugadivaemim znacheniem ? Ne vigu ja, ubeite, nikakogo zdes' nikakogo kriminala...
AS> Dim ii As Integer = 0 AS> Do AS> Dim j As Integer = 0 ' or whatever ya want AS> Console.WriteLine(j) AS> j = 10 AS> ii += 1 AS> Loop While ii < 3
N>Dumai nad slovami, otets.
Lexey был абсолютно прав. Таким образом обьявлять переменные абсолютно нормальная практика. Применятся в тех случаях когда переменная/обьект должна быть создана на каждой итерации цикла.
ЗЫ: У нас не принято обращаться в таком тоне. Будьте следующий раз аккуратнее.
Здравствуйте, Tom, Вы писали: Tom>Lexey был абсолютно прав. Таким образом обьявлять переменные абсолютно нормальная практика. Применятся в тех случаях когда переменная/обьект должна быть создана на каждой итерации цикла.
Не могли бы вы объяснить что будет происходить при объявление переменных Value типа.
Для объектов понятно выделяется память в куче, сборщик мусора пусть работает.
А что происходит с Value типом.Либо испльзуется старая переменная или каждый раз расширяется (сужается) стек ????
и солнце б утром не вставало, когда бы не было меня
Позволю себе не согласиться. Все же в VB.NET, в отличие от VB6, область видимости переменной ограничивается блоком, а не функцией. Так, в VB6 был бы вполне легален такой код:
If True Then
Dim i As Integer
i = 3
End If
MsgBox(i)
Более того, в диалог вывелось бы значение 3. В VB.NET же такой код просто не скомпилируется, так как там действительно используется с-подобная модель видимости переменных. Однако приведенный выше пример ее полностью нарушает. Таким образом, получается, что частично что-то переделали, а старые хвосты все же остались. Так что есть от чего фигеть на самом деле.