Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Structure Добавлено: 29.03.09 05:46  

Автор вопроса:  BG(Алексей)
Как то Eros(если я не ошибаюсь), в одном из топиков говорил, что структуры нужно использовать осторожно, что структура не должна превышать 16 байт.

Хотелось бы услышать почему? И/или почитать какую-нибудь ссылку на эту тему.

Ответить

  Ответы Всего ответов: 8  

Номер ответа: 1
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #1
Добавлено: 29.03.09 09:53
Нее, EROS не мог сказать такого :) Возможно что-то и было, но в другом контексте :) Пользуйтесь UDT наздоровье :)

Ответить

Номер ответа: 2
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #2 Добавлено: 29.03.09 10:47
что структура не должна превышать 16 байт

Все верно. Тесты показали, что именно этот размер является предельным для структур. Дальнейшее увеличение приводит к тормозам. В каком плане к тормозам.. из за разового примения,разумеется ничего будет, но если структура передается в цикле,то вполне возможны очень даже ощутимые последствия. И связано это с тем, что структура не относится к ссылочным типам, а это значит что любая передача структуры в функцию происходит путем создания нового экземпляра и копирования в нее данных, что не может не отразиться на производительности. Плюс еще заморочки с выделением памяти.. под структуры память выделяется не в стеке, а в куче.
Вообщем общие рекомендации автора книги таковы:
- по возможности вместо структур использовать классы
- если же все таки решено использовать структуры, то не допускать в них других НЕ ссылочных типов(строк, других структур и т.д.)
- размер структуры не должен превышать 16 байт

P.S. Яркий пример того, какой должна быть в идеале структура это Point, Size и т.д.

Ответить

Номер ответа: 3
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #3
Добавлено: 29.03.09 17:00
Странно.. Структуры и нужны главным образом для того, чтобы передаваться в функции по ссылке - указателем, дабы не загромождать стек своим весом. И их вес может быть довольно большой. 16 байт может как-то связано с выравниванием, но не есть какое-то табу. Множество функций API передают в стек не более 16 байт, но есть немало исключений, когда в стек запихивается по значению более 4 dword. Конечно, правило хорошего тона большие структуры передавать по ссылкам вот и все.

Ответить

Номер ответа: 4
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #4 Добавлено: 29.03.09 18:04
EROS пишет:
под структуры память выделяется не в стеке, а в куче.

Скорее не в куче, а в стеке

:-P

mc-black пишет:
Странно.. Структуры и нужны главным образом для того, чтобы передаваться в функции по ссылке - указателем, дабы не загромождать стек своим весом.

Наоборот, объект проще передать - передается только ссылка на объект (пусть ByVal/ByRef не смущают, в .NET в обоих случаях будет передаваться ссылка на объект).

mc-black, фишка в том что менеджер памяти .NET очень сильно заточен под работу с объектами. Объекты можно плодить миллионами без каких-либо последствий.
Я как-то уже приводил пример, и, наверное, повторюсь - за секунду у меня .NET создает 40 000 000 объектов. Просто вдумайся. Блин, .NET так заточен по работу с объектами что он просто вынуждает их создавать :)

2 EROS
Не совсем согласен про 16 байт :)
Посмотри для чего в основном используются структуры в .NET? Да для того чтоб отправлять их в функции Win32API :)
А там бывают структуры, у которых список полей занимает 2-3 страницы кода, и в 16 байт они совсем не вписываются :)

16 байт, очевидно, речь шла о внтуреннем активном использовании стурктур. Но тут вообще все понятно - стуктуры внутри .NET приложения просто не нужно использовать, почти везде нужно делать классы вместо структур. Ну исключение - те месте где MS нам и так структуры подсовывает типа Point и т.п.



Я знаю почему вообще этот вопрос возникает.
VB6 приучил программистов использовать структуры. Потому что это было легко, и даже не нужно было создавать отдельный файл для новой структуры. Не нужно было думать. А классы для VB6-программистов был каким-то адом, которые нужно самому создавать, и там еще много кода появляется, и вроде бы классы даже имеют какое-то отношение к ООП (какое-то слово которое придумали си-шники чтоб запугивать VB-шников)...
Поэтом у них еще с 98 года закрепилась жосткая фобия перед классами. Но ее нужно преодолять созерцанием и написанием .NET-овскихих прогармм, в которых 99% кода и данных располагается в классах.

Ответить

Номер ответа: 5
Автор ответа:
 Boconon



ICQ: 216390557 

Вопросов: 25
Ответов: 71
 Web-сайт: microsoft.com
 Профиль | | #5
Добавлено: 29.03.09 18:39
Поэтом у них еще с 98 года закрепилась жосткая фобия перед классами. Но ее нужно преодолять созерцанием и написанием .NET-овскихих прогармм, в которых 99% кода и данных располагается в классах.

100%!!! При попытках перехода с родимой 6ки на страшный дотнэт с этим как раз самые большие проблемы (ну по крайней мере у меня)... Попытки увенчались старательным изучением Срр :)

Ответить

Номер ответа: 6
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #6 Добавлено: 29.03.09 20:40
Steel Brand пишет:
16 байт, очевидно, речь шла о внтуреннем активном использовании стурктур

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

Steel Brand пишет:
стуктуры внутри .NET приложения просто не нужно использовать, почти везде нужно делать классы вместо структур

Ну тут тоже не стоит быть столь категоричным, если не понимаешь принципов работы структуры и боишься накосячить, тогда да - классы самое то. А если же придерживаться рекомендаций по использованию структур (см.выше), то на структурах еще можно и выигрыш в скорости получить при грамотном использовании. Автор в той книге на тестах скорости и памяти как раз и проводил обоснование максимального размера в 16 байт.

mc-black пишет:
Странно.. Структуры и нужны главным образом для того, чтобы передаваться в функции по ссылке - указателем, дабы не загромождать стек своим весом.

А в NET структура, в отличии от классов, передается не по ссылке, а по значение(копированием в новый объект), и чтобы не загромождать стек, она создается в куче. Отсюда и ограничения накладываемые на ее использование.

Ответить

Номер ответа: 7
Автор ответа:
 __Pavel__



Вопросов: 29
Ответов: 284
 Web-сайт: ммм.сайта.НЕТ
 Профиль | | #7
Добавлено: 30.03.09 00:01
эээ... Классы РУЛЯТ!!!

Все испарился...

Ответить

Номер ответа: 8
Автор ответа:
 BG(Алексей)



Вопросов: 26
Ответов: 295
 Профиль | | #8 Добавлено: 30.03.09 03:15
Спаибо. Довольно обширно и интересно.
EROS, а что за книга?

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам