Страница: 1 |
|
Вопрос: Structure
|
Добавлено: 29.03.09 05:46
|
|
Автор вопроса: BG(Алексей)
|
Как то Eros(если я не ошибаюсь), в одном из топиков говорил, что структуры нужно использовать осторожно, что структура не должна превышать 16 байт.
Хотелось бы услышать почему? И/или почитать какую-нибудь ссылку на эту тему.
Ответить
|
Номер ответа: 2 Автор ответа: EROS
Вопросов: 58 Ответов: 4255
|
Профиль | | #2
|
Добавлено: 29.03.09 10:47
|
что структура не должна превышать 16 байт
Все верно. Тесты показали, что именно этот размер является предельным для структур. Дальнейшее увеличение приводит к тормозам. В каком плане к тормозам.. из за разового примения,разумеется ничего будет, но если структура передается в цикле,то вполне возможны очень даже ощутимые последствия. И связано это с тем, что структура не относится к ссылочным типам, а это значит что любая передача структуры в функцию происходит путем создания нового экземпляра и копирования в нее данных, что не может не отразиться на производительности. Плюс еще заморочки с выделением памяти.. под структуры память выделяется не в стеке, а в куче.
Вообщем общие рекомендации автора книги таковы:
- по возможности вместо структур использовать классы
- если же все таки решено использовать структуры, то не допускать в них других НЕ ссылочных типов(строк, других структур и т.д.)
- размер структуры не должен превышать 16 байт
P.S. Яркий пример того, какой должна быть в идеале структура это Point, Size и т.д.
Ответить
|
Номер ответа: 4 Автор ответа: Artyom
Разработчик
Вопросов: 130 Ответов: 6602
|
Профиль | | #4
|
Добавлено: 29.03.09 18:04
|
EROS пишет:
под структуры память выделяется не в стеке, а в куче.
Скорее не в куче, а в стеке
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% кода и данных располагается в классах.
Ответить
|
Номер ответа: 6 Автор ответа: EROS
Вопросов: 58 Ответов: 4255
|
Профиль | | #6
|
Добавлено: 29.03.09 20:40
|
Steel Brand пишет:
16 байт, очевидно, речь шла о внтуреннем активном использовании стурктур
Именно о внутреннем использовании я и говорил, а в случае с API у нас просто нет выбора.. мы вынуждены юзать те структуры которые заложили разработчики.
Steel Brand пишет:
стуктуры внутри .NET приложения просто не нужно использовать, почти везде нужно делать классы вместо структур
Ну тут тоже не стоит быть столь категоричным, если не понимаешь принципов работы структуры и боишься накосячить, тогда да - классы самое то. А если же придерживаться рекомендаций по использованию структур (см.выше), то на структурах еще можно и выигрыш в скорости получить при грамотном использовании. Автор в той книге на тестах скорости и памяти как раз и проводил обоснование максимального размера в 16 байт.
mc-black пишет:
Странно.. Структуры и нужны главным образом для того, чтобы передаваться в функции по ссылке - указателем, дабы не загромождать стек своим весом.
А в NET структура, в отличии от классов, передается не по ссылке, а по значение(копированием в новый объект), и чтобы не загромождать стек, она создается в куче. Отсюда и ограничения накладываемые на ее использование.
Ответить
|
Страница: 1 |
Поиск по форуму