Провел небольшой тестик для ref и fixed на дефрагментацию. Прошу прощение за дублирование кода. Лень ...
public struct Element
{
public int FirstAdress,LastAdress;
public byte[] ar;
Element(int Size)
{
ar= new byte[Size];
FirstAdress=LastAdress=0;
}
}
public class TestRef
{
Element[] ArrayElement;
const int BeginSize = 1 << 10;
public TestRef(Element[] Ae)
{
ArrayElement = Ae;
for (int i=0; i<ArrayElement.Length; i++)
ArrayElement[i].ar= new byte[BeginSize+i];
}
unsafe public void SetFirstAdress()
{
for (int i = 1; i < ArrayElement.Length; i += 2)
fixed (byte * f = (byte*) &ArrayElement[i].ar[0])
{ ArrayElement[i].FirstAdress = (int)f;
f[3] = (byte)i;
}
}
unsafe public int GetAddress(int i)
{
int Result;
fixed (byte * f = (byte*) &ArrayElement[i].ar[0])
{ Result= (int)f; }
return Result;
}
unsafe public void SetLastAdress()
{
for (int i = 1; i < ArrayElement.Length; i += 2)
fixed (byte * f = (byte*) &ArrayElement[i].ar[0])
{ ArrayElement[i].LastAdress = (int)f; }
}
public void Прорядить()
{
for (int i = 0; i < ArrayElement.Length; i += 2)
{ ArrayElement[i].ar =null; }
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
}
public void TestRefElement( ref byte elem)
{
SetFirstAdress();
Прорядить();
SetLastAdress();
elem ++;
}
unsafe public void TestFixedElement(int index)
{
fixed (byte * f = (byte*) &ArrayElement[index].ar[3])
{
SetFirstAdress();
Прорядить();
SetLastAdress();
*f=(byte)(*f+1);
}
}
}
И соответственно вызов.
private void button2_Click(object sender, System.EventArgs e)
{
Element[] elements = new Element[10000];
TestRef TR = new TestRef(elements);
Random r = new Random(666666);
int index = r.Next(elements.Length - 1) | 1;
int adr = TR.GetAddress(index);
TR.TestRefElement(ref elements[index].ar[3]);
for (int i=1; i<elements.Length; i+=2)
if (elements[i].FirstAdress==elements[i].LastAdress)
textBox1.AppendText("Index=" + i.ToString() + Environment.NewLine);
byte EtalonValue = (byte)((byte)index + 1);
textBox1.AppendText(String.Format("Index ={0} FirstAdress={1} <> {2} -- Значение {3} == {4} {5}" + Environment.NewLine,index,elements[index].FirstAdress,elements[index].LastAdress,elements[index].ar[3],EtalonValue,adr));
}
private void button3_Click(object sender, System.EventArgs e)
{
Element[] elements = new Element[10000];
TestRef TR = new TestRef(elements);
Random r = new Random(666666);
int index = r.Next(elements.Length - 1) | 1;
int adr = TR.GetAddress(index);
TR.TestFixedElement(index);
for (int i = 1; i < elements.Length; i += 2)
if (elements[i].FirstAdress == elements[i].LastAdress)
textBox1.AppendText("Index=" + i.ToString() + Environment.NewLine);
byte EtalonValue = (byte)((byte)index + 1);
textBox1.AppendText(String.Format("Index ={0} FirstAdress={1} == {2} -- Значение {3} == {4} {5}" + Environment.NewLine, index, elements[index].FirstAdress, elements[index].LastAdress, elements[index].ar[3], EtalonValue, adr));
}
}
Для фиксированного указателя адресс объекта не меняется, все остальные дефрагментируются.
Для ref все объекты дефрагментируются.
Логично предположить, что ссылка имеет такую структуру Re[10]: C# — необходимость?
Надо посмотреть ассемблерный код. В любом случае не вижу проблем с хранение ссылок в поле объекта, и возврат ссылки как значение функции. Так или иначе она управляемая.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, GlebZ, Вы писали:
GZ>Знаешь, для JVM тоже писалось очень много языков. Например.
Одни писали, а другие боролись за гегимонию одного. Все языки для Явы написаны не с содействия Сана, а вопреки Сану.
GZ> Только где они сейчас. Никому не нужны. То же самое будет и с Net. Останутся например VB и С#, а остальное все отомрет.
Уже 2. Если учесть, что С++-ников сильно недолюбливающих все остальное не так уж и мало и то, что дотнет похоже не отвратим , то несомненно у новой версии МС++ есть будующее. Лидиром ему, по-моему, не стать, но свою долю рынка он отъест. Особенно учитывая его возможности по переносу унаследованного кода.
А ведь есть еще и иследовательские проекты. Те же функциональные языки могут оказаться очень востребованными если процессорная гонка и правда пойдет по пути увеличения количества ядер на одном камне.
GZ> Кому они нужны, если оформятся определенные стандарты написания программ под платформу. Несколько субъективное мнение, но C++/CLI, MC++, как его не зови тоже должен уйти со сцены. Как никому не нужный инструмент. Уже сейчас не много найдешь объявлений — требуется программист на С++ для Net.
Однако если ты знаешь еще и С++, то это несомненно будет положительным фактором при приеме на работу.
GZ>PS: Мне достаточно жаль людей которые повелись на байку что C++ код можно легко портировать под Net. Если бы у меня стояла такая задача, я бы портировал под C#. Трудоемкость не сильно бы возрасла, но код бы смотрелся и управлялся значительно лучше.
Гы. Так может поступить только тот у кого много бабок и времени. Портирование на Шарп — это сто процентное алгоритмическое переписывание. Может от этого качество продукта и повысится, но обойдется это в копеечку.
Вот представь себе. Есть у конторы продукт вроде Ворда или Визио... захотела она выпустить релиз для новой ОС. А что это значит? А значит это, что диаложки (коих не много, но все же) нужно в Авалон портировать. Разные 3D-фичи добавить. Новые фишки из ОС заюзать. Но при этом основная логика приложения не изменилас ведь. Не правда ли? А раз так, то можно просто втупую перекомпилировать все приложение в мсил и потихоничку заменять те самые диаложки на Авалоновские формы.
Ну, а тут еще в добавок такая фишка как возможность подключать к МС++-проекту модули на разных языках. Новые диалоги можно писать на том же шарпе используя визуальные редакторы и все радости IDE, а на МС++ только встраивать их в нужном месте (благодоря прекрасным возможностям интеграции).
Попробую провести анализ использования языков в самом МС. Например, возьмем Авалоновские сборки (версии 6.0.4030):
Причем PresentationCore и PresentationCore2 — это сборки осуществлюящие много низкоуровневого взаимодействия с ОС. Публичных управляемых классов в этих сборках не много. В PresentationCore вообще 90% составляют классы написанные на C#, однако МС++ кода явно хватает. И в основном он занимается двумя вещами:
1. Вопросами производительности. Например, в PresentationCore2 есть вот такой классик:
internal class Mth
{
// Methodspublic Mth();
public static unsafe ushort Calc90degClosestRotationFactor(transMatrix* matrix);
public static unsafe ushort Calc90degRotationFactor(transMatrix* matrix);
public static unsafe ushort Calc90degRotationFactorForEmboldening(transMatrix* matrix);
private static unsafe int CompDiv(int src1, int* src2);
private static unsafe void CompMul(int src1, int src2, int* dst);
public static int CountLowZeros(uint n);
public static int Div26Dot6(int num, int den);
public static int DivShiftLong(int sValue, short sFactor);
public static short DivShiftShort(short sValue, short sFactor);
public static int FixDiv(int __unnamed000, int __unnamed001);
public static int FixMul(int __unnamed000, int __unnamed001);
public static int FixRatio(short sA, short sB);
public static unsafe void FixXYMul(int* x, int* y, transMatrix* matrix);
public static int FracDiv(int __unnamed000, int __unnamed001);
public static int FracMul(int __unnamed000, int __unnamed001);
public static int FracSqrt(int __unnamed000);
public static unsafe int GeneralRotation(transMatrix* matrix);
public static int GetShift(uint n);
public static unsafe int Identity(transMatrix* matrix);
public static unsafe void IntelMul(int lNumPts, int* fxX, int* fxY, transMatrix* trans, int fxXStretch, int fxYStretch);
public static unsafe int IsMatrixStretched(transMatrix* trans);
public static int LongMulDiv(int a, int b, int c);
public static int max_abs(int a, int b);
private static int Max45Trick(int x, int y);
public static int Mul26Dot6(int a, int b);
public static short MulDivShorts(short x, short y, short z);
public static unsafe void MxConcat2x2(transMatrix* matrixA, transMatrix* matrixB);
public static unsafe void MxScaleAB(int sx, int sy, transMatrix* matrixB);
public static unsafe int PositiveRectangle(transMatrix* matrix);
public static unsafe int PositiveSquare(transMatrix* matrix);
public static int PowerOf2(int __unnamed000);
public static unsafe void ReduceMatrix(transMatrix* trans);
public static int SameStretch(int fxScaleX, int fxScaleY);
public static short ShortFracDiv(short x, short y);
public static short ShortFracDot(short x, short y);
public static int ShortFracMul(int x, short y);
public static short ShortFracMulDiv(short __unnamed000, short __unnamed001, short __unnamed002);
public static int ShortMulDiv(int a, short b, short c);
public static unsafe int UnitarySquare(transMatrix* matrix);
}
названия методов которого говорят сами за себя.
2. Вопросы взаимодействия с анменеджед-миром. Ведь Авалон — это всего лишь ОО-библиотека. В своих глубинах она все так же обращается к анменеджед-сервисам ОС. Другое дело, что в отличии от ВыньФормс она отдает ОС только самые низкоуровневые операции, а все контролы и т.п. живут в управляемом мире.
Так что уже видно, что с тодной сторны МС++ востребован. Но с другой повальный переход на него — это скорее мечты слишком привязанных к С++ людей. Если еще учесть, что есть орлы типа нашего горяче любимого ПК которые свой С++ ни за какие ковришки не продадут... а выпускать продукт под Авалон один фиг нужно... то и вопросов не возникает.
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Поскипано, т.к. в основном согласен.
> орлы типа нашего горяче любимого ПК которые свой С++ ни за какие ковришки не продадут...
ПК сдаст C++ с потрохами в любой момент, как только на горизонте появится другой язык, избавленный от многочисленных недостатков C++, но поддерживающий любимые ПК в C++ идиомы, при условии, что вокруг нового языка будет community, не менее привлекательное, чем вокруг C++. Правда, ПК очень сильно сомневается в том, что это произойдет сколько-нибудь скоро. О чем регулярно совершенно искренне грустит.
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, VladD2, Вы писали:
VD>2. Вопросы взаимодействия с анменеджед-миром. Ведь Авалон — это всего лишь ОО-библиотека. В своих глубинах она все так же обращается к анменеджед-сервисам ОС. Другое дело, что в отличии от ВыньФормс она отдает ОС только самые низкоуровневые операции, а все контролы и т.п. живут в управляемом мире.
Майкрософт говорит, что Avalon построен поверх DirectX, но не видно никаких связей в References. Не знаешь, как это понимать?
Здравствуйте, LSL, Вы писали:
LSL>Майкрософт говорит, что Avalon построен поверх DirectX, но не видно никаких связей в References. Не знаешь, как это понимать?
1. Вся связь с ОС и железом идет через анменеджед-длл-и, так называемый MIT. Поищи в виндовс-каталоге длл-и с префиксом mit.
2. DirectX базируется на COM и значит никаких прямых связей ты увидить в анменеджед-мире не сможешь.
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>1. Вся связь с ОС и железом идет через анменеджед-длл-и, так называемый MIT. Поищи в виндовс-каталоге длл-и с префиксом mit. VD>2. DirectX базируется на COM и значит никаких прямых связей ты увидить в анменеджед-мире не сможешь.
Действительно, связей нет даже в сборках Managed DX. А вот по шаблону *mit*.dll ничего не нашёл.
Здравствуйте, LSL, Вы писали:
LSL>Здравствуйте, VladD2, Вы писали:
VD>>1. Вся связь с ОС и железом идет через анменеджед-длл-и, так называемый MIT. Поищи в виндовс-каталоге длл-и с префиксом mit. VD>>2. DirectX базируется на COM и значит никаких прямых связей ты увидить в анменеджед-мире не сможешь.
LSL>Действительно, связей нет даже в сборках Managed DX. А вот по шаблону *mit*.dll ничего не нашёл.
Где искал? Надо искать в %SystemRoot%.
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, LSL, Вы писали:
LSL>>Здравствуйте, VladD2, Вы писали:
VD>>>1. Вся связь с ОС и железом идет через анменеджед-длл-и, так называемый MIT. Поищи в виндовс-каталоге длл-и с префиксом mit. VD>>>2. DirectX базируется на COM и значит никаких прямых связей ты увидить в анменеджед-мире не сможешь.
LSL>>Действительно, связей нет даже в сборках Managed DX. А вот по шаблону *mit*.dll ничего не нашёл.
VD>Где искал? Надо искать в %SystemRoot%.
Там и искал, в папке C:\WINDOWS\... а сам Авалон ставится в C:\WINDOWS\Microsoft.NET\Windows\v6.0.4030
Здравствуйте, LSL, Вы писали:
LSL>>>Действительно, связей нет даже в сборках Managed DX. А вот по шаблону *mit*.dll ничего не нашёл.
VD>>Где искал? Надо искать в %SystemRoot%.
LSL>Там и искал, в папке C:\WINDOWS\... а сам Авалон ставится в C:\WINDOWS\Microsoft.NET\Windows\v6.0.4030
Извиняюсь. Это я торможу. Конечно же не MIT, MIL. Одна из дллей точно называется MILCORE.DLL.
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.