Форум программистов, компьютерный форум, киберфорум
C++/CLI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
Vyacheslav

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

11.08.2011, 04:05. Показов 1460. Ответов 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];
...
? Я так думаю - может дело в приведении типов??
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.08.2011, 04:05
Ответы с готовыми решениями:

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

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

В чем разница объявлениями функций?
var add = function add2(a, b) { return a + b; } alert(add2(3,7)) add = function (a, b) { ...

6
86 / 62 / 69
Регистрация: 15.03.2007
Сообщений: 6,903
11.08.2011, 10:50
Я думаю что никакой. Компилятор в обоих случаях использует тип System.Double. Доказательством является то что конструкция
Console::WriteLine(__box(Matrix_2D[0,0])->GetType()->ToString());
в обоих случаях выводит System.Double.
0
Vyacheslav
11.08.2011, 21:41
Но в этом случае получается,что компиллятор проводит упаковку double в Double,что и показывает ToString.К тому же,насколько я понял,в управляемой динамической памяти может находится только объект на который указывает управляемый указатель (тип Double).А с массивом:необходим управляемый указатель на массив управляемых объектов? Т.е. получается управляемый указатель на массив необходим для уничтожения класса Array сборщиком мусора,а указатели на управляемые элементы массива уже для их поэлементного удаления сборщиком?
86 / 62 / 69
Регистрация: 15.03.2007
Сообщений: 6,903
14.08.2011, 14:36
Для начала надо знать что в .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
Спасибо большое за столь исчерпывающий ответ,очень признателен.
И ещё,если не трудно,Вы сказали,что :
'Массивы всегда хранятся в управляемой куче с отличиями для сссылочных и интегральных типов. Массив ссылочных типов состоит из отдельных ссылок, а массив интегральных типов содержит непосредственно данные этих типов'.
Это касается управляемых массивов( __gc ),
а ссылочные - Double,интегральные - double?
Matrix_2D = new double __gc[V_col,V_row];
Ну и насчет указателя - почему :'Скорее уж это usigned int или long'.
Спасибо ещё раз и не судите строго.
86 / 62 / 69
Регистрация: 15.03.2007
Сообщений: 6,903
15.08.2011, 10:27
> а ссылочные - 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
Спасибо за исчерпывающие ответы.Книгу обязательно куплю,ни в одной ещё не нашел полных ответов на многие вопросы,такие как упаковка/распаковка,зачем конкретно,типы(ссылочные/интегральные) и т.п. Казалось бы не столь значимые вопросы,но в них скрывается определение самой, можно так сказать философии .NET Framework.Никак не могу четко построить для себя представление,что это такое.
С уважением Вячеслав.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.08.2011, 21:42
Помогаю со студенческими работами здесь

В чем разница между двумя mnemonic?
Jump Instructions JMP xxx PC = operand JMP xxx JSR xxx ...

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

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

В чем разница между этими двумя HDD?
вот я не могу разобраться. подскажите, пожалуйста. 320 Gb Seagate, ST3320613AS, Barracuda 7200.11, SATA NCQ, 300 Mbytes/sec, 16 Mb,...

В чем разница между одним и двумя слэшами
Доброго времени! Объясните пожалуйста в чем разница: %-) FileStream fs = new FileStream("F:\\txtdoc\\fileOut.txt",...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в конфигурации КА2. Данные берутся из регистра сведений, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru