Re[27]: C# - необходимость?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 28.02.05 10:56
Оценка:
Здравствуйте, VladD2, Вы писали:

Провел небольшой тестик для 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# &mdash; необходимость?
Автор: Serginio1
Дата: 16.02.05



Надо посмотреть ассемблерный код. В любом случае не вижу проблем с хранение ссылок в поле объекта, и возврат ссылки как значение функции. Так или иначе она управляемая.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
и солнце б утром не вставало, когда бы не было меня
Re[4]: C# - необходимость?
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.03.05 20:46
Оценка: 6 (1)
Здравствуйте, GlebZ, Вы писали:

GZ>Знаешь, для JVM тоже писалось очень много языков. Например.


Одни писали, а другие боролись за гегимонию одного. Все языки для Явы написаны не с содействия Сана, а вопреки Сану.

GZ> Только где они сейчас. Никому не нужны. То же самое будет и с Net. Останутся например VB и С#, а остальное все отомрет.


Уже 2. Если учесть, что С++-ников сильно недолюбливающих все остальное не так уж и мало и то, что дотнет похоже не отвратим , то несомненно у новой версии МС++ есть будующее. Лидиром ему, по-моему, не стать, но свою долю рынка он отъест. Особенно учитывая его возможности по переносу унаследованного кода.

А ведь есть еще и иследовательские проекты. Те же функциональные языки могут оказаться очень востребованными если процессорная гонка и правда пойдет по пути увеличения количества ядер на одном камне.

GZ> Кому они нужны, если оформятся определенные стандарты написания программ под платформу. Несколько субъективное мнение, но C++/CLI, MC++, как его не зови тоже должен уйти со сцены. Как никому не нужный инструмент. Уже сейчас не много найдешь объявлений — требуется программист на С++ для Net.


Однако если ты знаешь еще и С++, то это несомненно будет положительным фактором при приеме на работу.

GZ>PS: Мне достаточно жаль людей которые повелись на байку что C++ код можно легко портировать под Net. Если бы у меня стояла такая задача, я бы портировал под C#. Трудоемкость не сильно бы возрасла, но код бы смотрелся и управлялся значительно лучше.


Гы. Так может поступить только тот у кого много бабок и времени. Портирование на Шарп — это сто процентное алгоритмическое переписывание. Может от этого качество продукта и повысится, но обойдется это в копеечку.

Вот представь себе. Есть у конторы продукт вроде Ворда или Визио... захотела она выпустить релиз для новой ОС. А что это значит? А значит это, что диаложки (коих не много, но все же) нужно в Авалон портировать. Разные 3D-фичи добавить. Новые фишки из ОС заюзать. Но при этом основная логика приложения не изменилас ведь. Не правда ли? А раз так, то можно просто втупую перекомпилировать все приложение в мсил и потихоничку заменять те самые диаложки на Авалоновские формы.

Ну, а тут еще в добавок такая фишка как возможность подключать к МС++-проекту модули на разных языках. Новые диалоги можно писать на том же шарпе используя визуальные редакторы и все радости IDE, а на МС++ только встраивать их в нужном месте (благодоря прекрасным возможностям интеграции).

Попробую провести анализ использования языков в самом МС. Например, возьмем Авалоновские сборки (версии 6.0.4030):

Microsoft.Windows.EventTracing.dll - C#
PresentationBuildTasks.dll         - C#
PresentationCore.dll               - C# + MC++
PresentationCore2.dll              - MC++
PresentationFramework.dll          - C#
PresentationUI.dll                 - C#
TabletCore.dll                     - C#
TabletFramework.dll                - C#
WindowsBase.dll                    - C#
WindowsFormsIntegration.dll        - C#
WindowsUIAutomation.dll            - C#
WindowsUIAutomationProxies.dll     - C#


Причем PresentationCore и PresentationCore2 — это сборки осуществлюящие много низкоуровневого взаимодействия с ОС. Публичных управляемых классов в этих сборках не много. В PresentationCore вообще 90% составляют классы написанные на C#, однако МС++ кода явно хватает. И в основном он занимается двумя вещами:
1. Вопросами производительности. Например, в PresentationCore2 есть вот такой классик:
internal class Mth
{
    // Methods
    public 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>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: C# - необходимость?
От: Павел Кузнецов  
Дата: 07.03.05 06:23
Оценка: :))
VladD2,

> <...>


Поскипано, т.к. в основном согласен.

> орлы типа нашего горяче любимого ПК которые свой С++ ни за какие ковришки не продадут...


ПК сдаст C++ с потрохами в любой момент, как только на горизонте появится другой язык, избавленный от многочисленных недостатков C++, но поддерживающий любимые ПК в C++ идиомы, при условии, что вокруг нового языка будет community, не менее привлекательное, чем вокруг C++. Правда, ПК очень сильно сомневается в том, что это произойдет сколько-нибудь скоро. О чем регулярно совершенно искренне грустит.
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[5]: C# - необходимость?
От: LSL  
Дата: 08.03.05 19:02
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>2. Вопросы взаимодействия с анменеджед-миром. Ведь Авалон — это всего лишь ОО-библиотека. В своих глубинах она все так же обращается к анменеджед-сервисам ОС. Другое дело, что в отличии от ВыньФормс она отдает ОС только самые низкоуровневые операции, а все контролы и т.п. живут в управляемом мире.


Майкрософт говорит, что Avalon построен поверх DirectX, но не видно никаких связей в References. Не знаешь, как это понимать?
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[5]: C# - необходимость?
От: GlebZ Россия  
Дата: 09.03.05 10:18
Оценка:
Здравствуйте, VladD2, Вы писали:

Извини, сообщение прочитал только сейчас. Я изменил мнение после того как врубился в C++/CLI. Мой ответ.
Автор: GlebZ
Дата: 07.03.05


С уважением, Gleb.

PS: честно говоря меня бы удовлетворило расширение функциональности C# для unsafe кода для реализации подобных вещей.
Re[6]: C# - необходимость?
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.03.05 12:24
Оценка: +1
Здравствуйте, LSL, Вы писали:

LSL>Майкрософт говорит, что Avalon построен поверх DirectX, но не видно никаких связей в References. Не знаешь, как это понимать?


1. Вся связь с ОС и железом идет через анменеджед-длл-и, так называемый MIT. Поищи в виндовс-каталоге длл-и с префиксом mit.
2. DirectX базируется на COM и значит никаких прямых связей ты увидить в анменеджед-мире не сможешь.
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: C# - необходимость?
От: LSL  
Дата: 09.03.05 17:33
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>1. Вся связь с ОС и железом идет через анменеджед-длл-и, так называемый MIT. Поищи в виндовс-каталоге длл-и с префиксом mit.

VD>2. DirectX базируется на COM и значит никаких прямых связей ты увидить в анменеджед-мире не сможешь.

Действительно, связей нет даже в сборках Managed DX. А вот по шаблону *mit*.dll ничего не нашёл.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[8]: C# - необходимость?
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.03.05 02:16
Оценка:
Здравствуйте, 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>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: C# - необходимость?
От: LSL  
Дата: 11.03.05 16:11
Оценка:
Здравствуйте, 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
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[10]: C# - необходимость?
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.03.05 21:47
Оценка:
Здравствуйте, 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>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.