Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++/CLI

Войти
Регистрация
Восстановить пароль
 
Vyacheslav
#1

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

11.08.2011, 04:05. Просмотров 1010. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос В чём разница между двумя объявлениями массива? (C++/CLI):

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

Код неправильно рассчитывает расстояние между двумя двумя координатами на сфере - C++/CLI
Тут расчёт расстояние между двумя двумя координатами на сфере. код не выводит расстояние . и выдаёт ошибку с арккосинусом deltSig =...

В чем разница между этими объявлениями? - C++/CLI WinForms
private: System::Windows::Forms::Label ^L2; и private: System::Windows::Forms::Label^ L2; если есть разница, могли бы мне ее...

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

Перенос элементов между двумя ListView - C++/CLI WinForms
Как можно перенести итемы с одного listView1 в другой listView2, которые были зачеканы? ListView::CheckedListViewItemCollection^...

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

6
bazile
65 / 41 / 20
Регистрация: 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 / 20
Регистрация: 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 / 20
Регистрация: 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
Привет! Вот еще темы с ответами:

В чем разница между двумя объявлениями класса - Delphi
Здравствуйте! Помогите, пожалуйста, разобраться В чем разница между двумя объявлениями: TClassName = class; end; TClassName =...

В чём разница между двумя модулями памяти ? - Серверы
Здравствуйте, ситуация следующая. На сервере установлена Планка ОЗУ Kingston KVR667D2S4P5/1G Так как памяти стало не хватать купили...

Разница между объявлениями указателя - C++
Часто вижу, при создании объекта класса, создают указатель на объект #include <iostream> using namespace std; class...

Разница между объявлениями указателей - C++
Есть такое: int *p; и такое: int *p = new int; Поясните, пожалуйста, в чём разница между этими объявлениями указателей?


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

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

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