Страница: 1 |
Вопрос: Structure | Добавлено: 29.03.09 05:46 |
Автор вопроса: ![]() |
Как то Eros(если я не ошибаюсь), в одном из топиков говорил, что структуры нужно использовать осторожно, что структура не должна превышать 16 байт.
Хотелось бы услышать почему? И/или почитать какую-нибудь ссылку на эту тему. |
Ответы | Всего ответов: 8 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #1 | Добавлено: 29.03.09 09:53 |
Нее, EROS не мог сказать такого ![]() ![]() ![]() |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 58 Ответов: 4255 ![]() |
Профиль | Цитата | #2 | Добавлено: 29.03.09 10:47 |
что структура не должна превышать 16 байт
Все верно. Тесты показали, что именно этот размер является предельным для структур. Дальнейшее увеличение приводит к тормозам. В каком плане к тормозам.. из за разового примения,разумеется ничего будет, но если структура передается в цикле,то вполне возможны очень даже ощутимые последствия. И связано это с тем, что структура не относится к ссылочным типам, а это значит что любая передача структуры в функцию происходит путем создания нового экземпляра и копирования в нее данных, что не может не отразиться на производительности. Плюс еще заморочки с выделением памяти.. под структуры память выделяется не в стеке, а в куче. Вообщем общие рекомендации автора книги таковы: - по возможности вместо структур использовать классы - если же все таки решено использовать структуры, то не допускать в них других НЕ ссылочных типов(строк, других структур и т.д.) - размер структуры не должен превышать 16 байт P.S. Яркий пример того, какой должна быть в идеале структура это Point, Size и т.д. |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ICQ: 308-534-060 Вопросов: 20 Ответов: 1860 |
Web-сайт: Профиль | Цитата | #3 | Добавлено: 29.03.09 17:00 |
Странно.. Структуры и нужны главным образом для того, чтобы передаваться в функции по ссылке - указателем, дабы не загромождать стек своим весом. И их вес может быть довольно большой. 16 байт может как-то связано с выравниванием, но не есть какое-то табу. Множество функций API передают в стек не более 16 байт, но есть немало исключений, когда в стек запихивается по значению более 4 dword. Конечно, правило хорошего тона большие структуры передавать по ссылкам вот и все. |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Вопросов: 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% кода и данных располагается в классах. |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ICQ: 216390557 Вопросов: 25 Ответов: 71 |
Web-сайт: Профиль | Цитата | #5 | Добавлено: 29.03.09 18:39 |
Поэтом у них еще с 98 года закрепилась жосткая фобия перед классами. Но ее нужно преодолять созерцанием и написанием .NET-овскихих прогармм, в которых 99% кода и данных располагается в классах.
100%!!! При попытках перехода с родимой 6ки на страшный дотнэт с этим как раз самые большие проблемы (ну по крайней мере у меня)... Попытки увенчались старательным изучением Срр ![]() |
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 58 Ответов: 4255 ![]() |
Профиль | Цитата | #6 | Добавлено: 29.03.09 20:40 |
Steel Brand пишет:
16 байт, очевидно, речь шла о внтуреннем активном использовании стурктур Именно о внутреннем использовании я и говорил, а в случае с API у нас просто нет выбора.. мы вынуждены юзать те структуры которые заложили разработчики. Steel Brand пишет:
стуктуры внутри .NET приложения просто не нужно использовать, почти везде нужно делать классы вместо структур Ну тут тоже не стоит быть столь категоричным, если не понимаешь принципов работы структуры и боишься накосячить, тогда да - классы самое то. А если же придерживаться рекомендаций по использованию структур (см.выше), то на структурах еще можно и выигрыш в скорости получить при грамотном использовании. Автор в той книге на тестах скорости и памяти как раз и проводил обоснование максимального размера в 16 байт. mc-black пишет:
Странно.. Структуры и нужны главным образом для того, чтобы передаваться в функции по ссылке - указателем, дабы не загромождать стек своим весом. А в NET структура, в отличии от классов, передается не по ссылке, а по значение(копированием в новый объект), и чтобы не загромождать стек, она создается в куче. Отсюда и ограничения накладываемые на ее использование. |
Номер ответа: 7 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 29 Ответов: 284 |
Web-сайт: Профиль | Цитата | #7 | Добавлено: 30.03.09 00:01 |
эээ... Классы РУЛЯТ!!!
Все испарился... |
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 26 Ответов: 295 |
Профиль | Цитата | #8 | Добавлено: 30.03.09 03:15 |
Спаибо. Довольно обширно и интересно.
EROS, а что за книга? |
Страница: 1 |
|