![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
Arks |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 197 Регистрация: 7.5.2006 Где: Барнаул Репутация: нет Всего: нет |
Интересует, что делают эти свойства: считывают значения из какой-то переменной или вычисляют? Как это в массиве и строках организовано?
Просто интересует надо ли запихивать в цикле эти данные отдельную переменную или также эффективно будет напрямую свойства читать? |
|||
|
||||
ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Arks, конечно считывают.
Уж сильно часто эта длинна используется. Для таких вопросов есть reflector Это сообщение отредактировал(а) ivashkanet - 12.12.2006, 10:14 |
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
В рефлекторе такие свойства помечены атрибутом [MethodImpl(MethodImplOptions.InternalCall)] и не имеют реализации
![]() -------------------- ![]() |
|||
|
||||
ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
![]() А во всяких ArrayList, List<T> --- длина храниться ![]() ![]() ![]() |
|||
|
||||
Arks |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 197 Регистрация: 7.5.2006 Где: Барнаул Репутация: нет Всего: нет |
Спасибо за ответы.
Для ivashkanet, неа. Потому что, вычислять долго и неэффективно, как и для массива. Или что ты имел в виду? Это сообщение отредактировал(а) Arks - 12.12.2006, 16:36 |
|||
|
||||
ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Это как раз и означает, что длина обычного массива вычисляется. Но не обычными средствами, а низкоуровневыми. Типа <размер в байтах> /4 . А может и еще круче ![]() |
|||
|
||||
Arks |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 197 Регистрация: 7.5.2006 Где: Барнаул Репутация: нет Всего: нет |
Так вы уж определитесь пожалуйста с когда вычисляется, когда нет?
![]() Добавлено @ 17:12 Кстати, я в рефлекторе ничего путного не нашёл:
Мне это ровным счётом ничего не говорит. |
|||
|
||||
ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Во первых: а наф оно тебе? Во вторых: Дуда же написал, что у этого свойства стоит атрибут MethodImpl(MethodImplOptions.InternalCall). Если перевести на русский, то РеализацияМетода(ВнутреннийВызов). Что еще не понятно? |
|||
|
||||
Arks |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 197 Регистрация: 7.5.2006 Где: Барнаул Репутация: нет Всего: нет |
1) Хочу знать как эффективнее - не охото, чтобы он в цикле тьму времени терял на вызовы фунцкий.
2) Из того, что сказал Дуда, я так понял, что длина в свойствах с MethodImpl(MethodImplOptions.InternalCall) хранится, а через пост ты сказал, что вычисляется. Так где правда? И в том коде, что я показал как раз и есть этот внутренний вызов? MethodImpl(MethodImplOptions.InternalCall)? Так? |
|||
|
||||
ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Зависит от ситуации. Например для обычных массивов она вычисляется, а для коллекций --- хранится. См. выше и перечитай тему сначала. Нет. Там только вызов метода Array_GetLength. Нажми на него и посмотри что именно вызывается. |
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Для строк размер стопудово хранится, а не вычисляется, т.к. строка - неизменяемый объект. Не хранится прямо в классе String по гейтс знает каким причинам, возможно это как-то связано с возможностью интернирования строк. Размер Array также неизменяемая величина, но здесь сложнее сказать, почему размер не хранится в классе. И тот и другой класс имеют синтаксические аналоги - возможно, причина как-то связана и с этим. В любом случае, нам остаётся только гадать. Хотя может в гугле что-то найдётся по этому поводу...
-------------------- ![]() |
|||
|
||||
ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
С чего это ты взял? Для строк стоит тот же MethodImpl(MethodImplOptions.InternalCall). А вот это чистая правда ![]() |
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
С того, что -------------------- ![]() |
|||
|
||||
ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Нее, mr.DUDA, так и массив такой же неизменяемый
![]() Хочу оговориться: Я бы хранил это значение, но меня смущает InternalCall ![]() А вообще --- какая хрен разница ![]() |
|||
|
||||
Arks |
|
||||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 197 Регистрация: 7.5.2006 Где: Барнаул Репутация: нет Всего: нет |
А вот на что ссылается тот код:
Что он делает я честно говоря не врубился, зато нашёл кое-что другое. Длина строки действительно хранится. Вот:
Длина массива похоже хранится в этой переменной:
Это сообщение отредактировал(а) Arks - 13.12.2006, 09:53 |
||||||
|
|||||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 25 Всего: 173 |
Массивы так глубоко зашиты в рантайм, что такие вещи надо скорее не рефлектором смотреть, а в Роторе.
Или смотреть сгенерированный машинный код с помощью cordbg, только не забыть m JitOptimizations 1. На простеньком коде:
выяснилось, что длина массива хранится со смещением 4 байта от адреса объекта в памяти, дальше следует непосредственно содержимое массива. JIT загнал адрес a в регистр, но поместить длину в регистр не догадался. Равно как и не догадался убрать проверку на выход за границу массива. Длина строки хранится со смещением +8 байт. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
Yama |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 167 Регистрация: 2.8.2006 Репутация: 2 Всего: 2 |
В любом случае на низком уровне сам текст строки хранится в виде массива *char. Я когда-то баловался тем, что писал на C++ класс типа MyString, в котором реализовывал и свойства Length (правда, как функцию, которая возврашает длину строки ![]() ![]() Сама по себе строка, если изначально не определена как const - величина изменяемая и измеряемая, причем метод измерения длины оной строки может варьироваться в зависимости от реализации методов - от запроса функции mystr.Length(), которая вычисляет длину в момент запроса, выдет ее и прекращает свое существование, до реализации отдельного свойства класса типа mystr.count , который может вычислятся и в констукторе класса при инициализации, и непосредственно при запросе.. опять таки все зависит от каждой конкретной реализации класса String и требований, которые к нему предъявляются... Отредактировано.. З.Ы. Сорри, не ту цитату добавил 1й раз ![]() Добавлено @ 20:25
2Void Кстати, если ты решил разобраться с С и с выделением и управлением памятью в С и т.д. и т.п., советую тебе почитать Страуструпа и любые издания, которые посвящены непосредственно базовому языку С, которые выходили года до 1995 ![]() З.Ы. 2Mr.DUDA СОРРРИИИИ за оффтоп ![]() ![]() Это сообщение отредактировал(а) Yama - 15.12.2006, 20:16 --------------------
Если бы строители строили дома так же, как программисты пишут программы, то первый же залетевший в форточку дятел разрушил бы всю нашу цивилизацию. |
|||
|
||||
Exception |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 4525 Регистрация: 26.12.2004 Репутация: 29 Всего: 186 |
Товарищ, ошибаетесь.
|
||||
|
|||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Yama,
Мы обсуждаем именно дотнетовскую реализацию String, а не сишную. - string является неизменяемым объектом, сложение строк и substring создают новый объект, а не модифицируют буфер char-ов - внутреннее представление строки - unicode (2 байта на символ), а не char P.S. думаю, что Void хорошо знаком и с изданиями Страуструпа и проч., так что зря учить его пытаетесь ![]() -------------------- ![]() |
|||
|
||||
Yama |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 167 Регистрация: 2.8.2006 Репутация: 2 Всего: 2 |
Exception,
mr.DUDA, ![]() Каюсъ!!!!!!! Ребят, чесслово не думал, что под .нет все настолько переделали ![]() ![]() *ушел учить .нет мат.часть........* --------------------
Если бы строители строили дома так же, как программисты пишут программы, то первый же залетевший в форточку дятел разрушил бы всю нашу цивилизацию. |
|||
|
||||
Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 24 Всего: 93 |
Ну, э... вообще-то... char -- это и есть 2 байта ![]() -------------------- Да. Именно так. |
|||
|
||||
Yama |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 167 Регистрация: 2.8.2006 Репутация: 2 Всего: 2 |
Но...... в .нет ![]() http://msdn2.microsoft.com/en-us/library/system.string.aspx
З.Ы. учу .нетматчасть ![]() --------------------
Если бы строители строили дома так же, как программисты пишут программы, то первый же залетевший в форточку дятел разрушил бы всю нашу цивилизацию. |
||||
|
|||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Дрон, а мы про С говорили, там 1 байт на char. У них есть двухбайтный аналог - short, unsigned short или wchar_t. -------------------- ![]() |
|||
|
||||
Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 24 Всего: 93 |
Брр... Совсем запутался ![]() Ну ладно. Не буду встревать в чужие темы ![]() -------------------- Да. Именно так. |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |