![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: нет Всего: 260 |
Обьясните принцип, согласно которому в коде
Поле класса System::Drawing::Color не создается("error C3160: 'c' : cannot declare interior __gc pointer or reference as a member of 'test::some'"), а вот в качестве параметра и переменной используется запросто. Для меня это очень странным кажется, не могу понять закономерность. Просветите, пожалуйста. |
|||
|
||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 24 Всего: 93 |
Хмм... из MSDN мне вообще ничего не понятно http://msdn2.microsoft.com/en-US/library/18xa23yk.aspx
Видимо, особенности С++ и, видимо, это как-то связано с тем, что Color это структура, а не класс. Попробуй объявить просто
Это сообщение отредактировал(а) Дрон - 4.12.2006, 16:09 -------------------- Да. Именно так. |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: нет Всего: 260 |
Дрон, спасибо, мне кажется, это сработает
___________________________________________________________________ Я выяснил, что это связано с тем, что Color описан как __value, то есть нечто, передаваемое в функцию по значению, а хранящееся в стеке. Отсюда вытекает особенность поведения: - внутри функции/метода как в качестве параметра,так и в качестве локальной переменной указатель на эту дуру вполне валиден. Только, видимо, излишен - проверить сейчас не могу, но, видимо, как и указал Дрон, без взятия адреса тоже будет работать. - внутри класса стек не создается; соотвественно взятие адреса для создания указателя на экземпляр Color - просто бесполезно. А вот вариант вполне может прокатить. Одно смущает - получается объект со всеми полями в стеке сидит? |
|||
|
||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Ну почему со всеми только теми которые сами являются структурами, все остальные сидят в куче, а в стеке есть ссылка на них P.S. skyboy, а чё ты начал с С++ .Net? Это сообщение отредактировал(а) ivashkanet - 4.12.2006, 15:44 |
|||
|
||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 24 Всего: 93 |
Да, такова особенность структур (__value типов). В принципе, это делается для некоторого увеличения быстродействие -- чаще всего там очень мало полей и памяти много они не занимают. Так же для них не требуется отдельная сборка мусора, т.е. они просто удаляются вместе со стеком. В общем там есть свои особенности -- можно поискать в интернете сравнения value types и reference types. Например тут: http://msdn.microsoft.com/msdnmag/issues/1200/dotnet/ -------------------- Да. Именно так. |
|||
|
||||
| skyboy |
|
||||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: нет Всего: 260 |
ну, это понятно. Но все равно кажется странным, что непростой класс Color объявлен аки __value. Или я чей-то не понял и это всё-таки не класс? Обучение в универе. Сам бы выбирал - скорее попробовал бы Prolog.NET
Спасибо На случай, если вдруг кто в английском не шибко кумекает, статья на русском на RSDN на ту же тему. |
||||
|
|||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 24 Всего: 93 |
На самом деле в Color нет ничего сложного. Там много статических и const полей, но они памяти не занимают. Судя по Reflector там instance (забыл как по-русски... ну в общем не статических, "нормальных") полей всего 4: short knownColor; string name; short state; long value; Итого размер 8 + 2 + 2 + sizeof(указатель) байт. Ничего страшного для стека, зато избавляемся от лишней сборки мусора, поскольку Color может использоваться довольно интенсивно. Это сообщение отредактировал(а) Дрон - 4.12.2006, 16:08 -------------------- Да. Именно так. |
|||
|
||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
А почему он не простой? Внутри него хранится всего лишь 4 битный код цвета ARGB и все Все остальное это свойства и функции, работающие с этим числом. Которые в стеке не хранятся Так что, этот класс занимает не больше чем int Добавлено @ 16:11 Наврал Но их могло и не быть, а Колором можно было бы пользоваться |
|||
|
||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 24 Всего: 93 |
Угу. Я сам удивился, что там ещё что-то есть -------------------- Да. Именно так. |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: нет Всего: 260 |
"указатель" - это указатель на запись в таблице виртуальных фукнкций? Как всполошились Надо будет отвыкать... Спасибо за помощь. Теперь я абсолютно уверен, что заработает |
|||
|
||||
| Дрон |
|
||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 24 Всего: 93 |
Уфф... На самом деле я имел ввиду, что указатель на объект string. А насчёт VTABLE я вообще-то не подумал, но на самом деле это не применимо к структурам в .NET -- от них нельзя наследоваться И вообще. Что нам мешает проверить размер? Делаем (только это в C# -- мне так проще)
Получаем 24... Хмм... Ну правда, там ещё выравнивание Без выравнивания такая же структура занимает 16 байт. Без выравнивания, и без указателя на объект string -- всего 12. Т.е. всё, как и ожидалось: 2 раза по 2 байта на short + 8 байт на long + 4 (указатель) = 16. Это сообщение отредактировал(а) Дрон - 4.12.2006, 16:41 -------------------- Да. Именно так. |
||||
|
|||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: нет Всего: 260 |
елки-моталки, никак не приноровлюсь к работе со структурами, как с объектами По теме: работает System::Drawing::Color с и не пищит Спасибо и участвующим, и просто сочувствующим! |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |