Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++/CLI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
Vyacheslav
#1

В чём разница между двумя объявлениями массива?

11.08.2011, 04:05. Просмотров 1018. Ответов 6
Метки нет (Все метки)

Вопрос новичка,но тем не менее,скажите пожалуйста,буду очень признателен.
В чем разница между этими двумя объявлениями управляемого массива,компиллятор воспринимает оба варианта:
1)
double Matrix_2D[,];
...
Matrix_2D = new double __gc[V_col,V_row];
...
2)
Double Matrix_2D[,];
...
Matrix_2D = __gc new Double[V_col,V_row];
...
? Я так думаю - может дело в приведении типов??
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.08.2011, 04:05
Ответы с готовыми решениями:

В чём разница между полем, свойством и атрибутом
Не уверен правильно ли понимаю: Поле – член класса, который определяет...

Код неправильно рассчитывает расстояние между двумя двумя координатами на сфере
Тут расчёт расстояние между двумя двумя координатами на сфере. код не выводит...

В чем разница между этими объявлениями?
private: System::Windows::Forms::Label ^L2; и private:...

В чём разница между "::" и "->" в C++/CLI
В чём разница?Между "::" и "->" в C++/CLI

Перенос элементов между двумя ListView
Как можно перенести итемы с одного listView1 в другой listView2, которые были...

6
bazile
65 / 41 / 68
Регистрация: 15.03.2007
Сообщений: 6,909
11.08.2011, 10:50 #2
Я думаю что никакой. Компилятор в обоих случаях использует тип System.Double. Доказательством является то что конструкция
Console::WriteLine(__box(Matrix_2D[0,0])->GetType()->ToString());
в обоих случаях выводит System.Double.
0
Vyacheslav
11.08.2011, 21:41 #3
Но в этом случае получается,что компиллятор проводит упаковку double в Double,что и показывает ToString.К тому же,насколько я понял,в управляемой динамической памяти может находится только объект на который указывает управляемый указатель (тип Double).А с массивом:необходим управляемый указатель на массив управляемых объектов? Т.е. получается управляемый указатель на массив необходим для уничтожения класса Array сборщиком мусора,а указатели на управляемые элементы массива уже для их поэлементного удаления сборщиком?
bazile
65 / 41 / 68
Регистрация: 15.03.2007
Сообщений: 6,909
14.08.2011, 14:36 #4
Для начала надо знать что в .NET Framework типы делятся на две категории - ссылочные (reference types) и интегральные типы (value types). Ссылочные типы хранят ссылку на объект в управляемой куче, а интегральные типы хранят свои данные в себе и могут размещаться в стеке или встраиваться (inline) в другие структуры данных. Массивы всегда хранятся в управляемой куче с отличиями для сссылочных и интегральных типов. Массив ссылочных типов состоит из отдельных ссылок, а массив интегральных типов содержит непосредственно данные этих типов.

Следующее важное понятие это упаковка/распаковка (boxing/unboxing). С интегральным типом на этапе выполнения не связано никакой информации о его типе и чтобы вызывать какой-то метод класса Object или интерфейса реализовыванного этим типом надо выполнять упаковку т.е. создать в управляемой куче копию переменной - кстати это довольно дорогая операция в .NET 1.x - чтобы среда исполнения смогла произвести вызов метода-члена для данной переменной как для ссылочного типа.

Вооруженные этими знаниями начинаем разбор твоих вопросов

> Но в этом случае получается,что компиллятор проводит
> упаковку double в Double,что и показывает ToString.
Не компилятор, а программист. Компиляторы VB.NET и С# скрывают такие подробности от программиста, а в C++ with Managed Extensions (далее C++/wME) программист должен сам явно указывать необходимые ему действия.

> К тому же,насколько я понял,в управляемой динамической памяти
> может находится только объект на который указывает
> управляемый указатель (тип Double).
В C++/wME есть (условно!) две области памяти - управляемая и неуправляемая. Ты как программист должен решать какая тебе нужна.
Насчет типа я не понял. Ты думашь что тип указателя в самом деле double? Скорее уж это usigned int или long.

> Т.е. получается управляемый указатель на массив необходим для
> уничтожения класса Array сборщиком мусора,а указатели на
> правляемые элементы массива уже для их поэлементного
> удаления сборщиком?
Указатель нужен для отслеживания сборщиком жив ли объект - т.е. есть ли него ссылки. Если ссылок нет, объект удаляется из кучи, куча сжимается, управдяемые ссылки в программе обновляются на новые адреса.

На подробное объяснение принципов работы сборщика мусора у меня сил нет. Это очень большая тема. Советую купить книгу Джефри Рихтера 'Программирование на платформе Microsoft .NET Framework' где хорошо описано внутренее устройство .NET Framework.
0
Vyacheslav
14.08.2011, 23:39 #5
Спасибо большое за столь исчерпывающий ответ,очень признателен.
И ещё,если не трудно,Вы сказали,что :
'Массивы всегда хранятся в управляемой куче с отличиями для сссылочных и интегральных типов. Массив ссылочных типов состоит из отдельных ссылок, а массив интегральных типов содержит непосредственно данные этих типов'.
Это касается управляемых массивов( __gc ),
а ссылочные - Double,интегральные - double?
Matrix_2D = new double __gc[V_col,V_row];
Ну и насчет указателя - почему :'Скорее уж это usigned int или long'.
Спасибо ещё раз и не судите строго.
bazile
65 / 41 / 68
Регистрация: 15.03.2007
Сообщений: 6,909
15.08.2011, 10:27 #6
> а ссылочные - Double, интегральные - double?
Ну нет же!
Я выше ответил - double и Double (в данном случае!) это один о тот же тип - System.Double. Он является интегральным. Ты видимо путаешь типы C++ и .NET Framework.

> Matrix_2D = new double __gc[V_col,V_row];
> Ну и насчет указателя - почему :'Скорее уж это usigned
> int или long'.
Потому что на платформе Intel указатели сейчас имеют такие типы.
Ты выделяещь не массив указателей типа double, а массив значений типа double. В переменную Matrix_2D будет записан указатель на этот массив. Но это не значит у него будет тип double. Какой он будет иметь тип тебя не должно волновать - это детали реализации.
0
Vyacheslav
15.08.2011, 21:42 #7
Спасибо за исчерпывающие ответы.Книгу обязательно куплю,ни в одной ещё не нашел полных ответов на многие вопросы,такие как упаковка/распаковка,зачем конкретно,типы(ссылочные/интегральные) и т.п. Казалось бы не столь значимые вопросы,но в них скрывается определение самой, можно так сказать философии .NET Framework.Никак не могу четко построить для себя представление,что это такое.
С уважением Вячеслав.
15.08.2011, 21:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.08.2011, 21:42

Как переназначить обработку события между двумя Button?
Как переключиться между 2 событиями (клик), b1_Click и b1_Click2? Переключение...

В чем разница между двумя объявлениями класса
Здравствуйте! Помогите, пожалуйста, разобраться В чем разница между двумя...

В чём разница между двумя модулями памяти ?
Здравствуйте, ситуация следующая. На сервере установлена Планка ОЗУ Kingston...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru