Re[12]: C# - необходимость?
От: Павел Кузнецов  
Дата: 17.02.05 14:07
Оценка:
VladD2,

> S> T% я себе представляю как

> S>
> S>     struct Ref
> S>     {
> S>      object obj;
> S>        int OffSet;
>     
> S>     }
> S>

> Забавно, что ты почти угодал.
> Почитай вот это http://www.codeproject.com/dotnet/pointers.asp (раздел System.TypedReference).

Не смущай человека: TypedReference и T% — совершенно разные вещи.
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[22]: C# - необходимость?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 17.02.05 14:13
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, Serginio1, Вы писали:

S>> И чем это плохо????
S>Плохо тем, что это не верифицируется. Потому, что нет способа убедиться, что ты вернул из пользовательского кода не просто управляемый указатель, а управляемый указатель на валидный объект. К сожалению, инструкции ldarga и ldloca портят всю картину.
Ну дык возврат стековой переменной должен быть пресечен уже на этапе компиляции. Или я не о том.
Что в данном случае верификация????

S>На самом деле, для кулдевелоперов есть-таки лазейка. Можно локализовать такой код в сборке, которой выдается привилегия игнорировать верификацию.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
и солнце б утром не вставало, когда бы не было меня
Re[12]: C# - необходимость?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 17.02.05 14:25
Оценка:
Здравствуйте, VladD2, Вы писали:


VD>Забавно, что ты почти угодал.

VD>Почитай вот это http://www.codeproject.com/dotnet/pointers.asp (раздел System.TypedReference). И вообще пошукай на слово __reftype.

Не это по сути Re: Ссылочные и размерные типы
Автор: Serginio1
Дата: 17.02.05


Даешь ссылку не только в стеке.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
и солнце б утром не вставало, когда бы не было меня
Re[20]: C# - необходимость?
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.02.05 14:36
Оценка: 11 (2)
Здравствуйте, Sinclair, Вы писали:

S>Более полное использование ссылок в интерфейсах могло бы разрешить нам порождение сверхвысокоэффективных многомерных массивов вэлью-типов обобщеннным способом.

S>Если бы мы могли сделать вот такой интерфейс:
S>
S>public interface IBitmap<PointType>
S>{
S>  public int Height;
S>    public int Width;
S>    public PointType& this[int x, int y]{ get;}
S>}
S>

S>то это было бы офигеть как круто в смысле производительности.

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

Тут было бы разумно сделать следующее. Наложить на компилятор обязанности эмулировать модификацию поместу. Возомжно даже ввести в свойства новую семантику обеспечивающую такую модификацию. Ну, например:
class A<T>
{
    T[] _array;
    
    public T this[int index]
    { 
        get { return _array[index]; }
        set { _array[index] = value; }
        replace
        {
            yeld return _array[index];
        }
    }
}

Тогда можно было и инкапсуляцию сохранить:
class A<T>
{
    T[] _array;
    
    public T this[int index]
    { 
        get { return _array[index]; }
        set { _array[index] = value; }
        replace
        {
            T temp = _array[index];
            yeld return temp;
            if (!Check(temp))
                throw new Exception("Попытка установить ошибочное значение!");
            _array[index] =    temp;
        }
    }
}

И эффектино обрабатывать случаи модификации по месту, так как оптимизировать ее уже было бы делом техники.

Возможно даж можно обойтись без расширения техники. В принципе ведь джит может определять, что свойства являются прямыми эксесорами к ячейкам памяти и видя модификацию по месту (которую он сейчас отвергает) просто оптимизировать код. Более того нечто похожее происходит при работе с простыми типами и просыми свойствами. Надо лишь распространить эту практику и дальше. Тогда и ссылки будут не нужны, и эффектиность с удосбтвом поднимутся.
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: C# - необходимость?
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.02.05 15:08
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Не смущай человека: TypedReference и T% — совершенно разные вещи.


Не, Пашь, я тебе уже хрен знает сколько времени пытаюсь объяснить, что это одно и тоже. Жц не может просто указателями пользоваться если они не на начало объекта в хипе указывают. Иначе сбивается алгоритм перестановки объектов в памяти. Так что джит видя возврат ссылки лепит приблизительно такую конструкцию. И эффектиность этого дела, по словам народа копающегося в ЖЦ, далека от прямых ссылок.
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: C# - необходимость?
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.02.05 15:08
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> Даешь ссылку не только в стеке.


Это невозможно при данном устройстве ЖЦ. Да и вредно с точки зрения инкапсуляции.
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[14]: C# - необходимость?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 17.02.05 15:16
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, Serginio1, Вы писали:


S>> Даешь ссылку не только в стеке.


VD>Это невозможно при данном устройстве ЖЦ. Да и вредно с точки зрения инкапсуляции.


Ну делегаты по своей сути тоже являются своего рода ссылками. И ничего. Приведенная мной структура будет съедобна для ЖЦ, тип известен нужно только смещение. Или ввели бы по аналогии с делегатами типизированные FieldInfo
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
и солнце б утром не вставало, когда бы не было меня
Re[14]: C# - необходимость?
От: Павел Кузнецов  
Дата: 17.02.05 16:07
Оценка:
VladD2,

> ПК>Не смущай человека: TypedReference и T% — совершенно разные вещи.


> Не, Пашь, я тебе уже хрен знает сколько времени пытаюсь объяснить, что это одно и тоже. Жц не может просто указателями пользоваться если они не на начало объекта в хипе указывают. Иначе сбивается алгоритм перестановки объектов в памяти. Так что джит видя возврат ссылки лепит приблизительно такую конструкцию.


О! Так это не оговорка, а заблуждение Смотри сюда:
public ref class A
{
public:
     int% a();

private:
     int x_; // чтоб i_ было не в начале объекта
     int i_;
};

В другом файле, чтоб не инлайнил:
int% A::a()
{
     return i_;
}

вызов:
void C::test()
{
     A a;
     a.a() = 15;
}

Смотрим, во что это выливается в IL:
.method public instance int32& a() cil managed
{
       // Code Size: 9 byte(s)
       .maxstack 1
       .locals (
             int32& numRef1)
       L_0000: ldarg.0
       L_0001: ldflda int32 cpp_cli.A::i_
       L_0006: stloc.0
       L_0007: ldloc.0
       L_0008: ret
}

вызов:
.method public static void test() cil managed
{
       // Code Size: 18 byte(s)
       .maxstack 2
       .locals (
             cpp_cli.A a1)
       L_0000: ldnull
       L_0001: stloc.0
       L_0002: newobj instance void cpp_cli.A::.ctor()
       L_0007: stloc.0
       L_0008: ldloc.0
       L_0009: call instance int32& cpp_cli.A::a()
       L_000e: ldc.i4.s 15
       L_0010: stind.i4
       L_0011: ret
}

Пока никаких TypedReference, обычные managed pointers.

Едем дальше. Вот во что это выливается после работы JIT:
int% A::a()
{
     return i_;
00000000  push        edi
00000001  push        esi
00000002  test        dword ptr [esp+FFFFFBC0h],eax
00000009  mov         edi,ecx
0000000b  cmp         dword ptr ds:[001D8314h],0
00000012  je          00000019
00000014  call        760C389D
00000019  xor         esi,esi
0000001b  lea         eax,[edi+8]
0000001e  cmp         ecx,dword ptr [eax]
00000020  mov         esi,eax
}
00000022  mov         eax,esi
00000024  pop         esi
00000025  pop         edi
00000026  ret

вызов:
void C::test()
{
00000000  push        edi
00000001  push        esi
00000002  test        dword ptr [esp+FFFFFBC0h],eax
00000009  cmp         dword ptr ds:[001D8314h],0
00000010  je          00000017
00000012  call        760C3935
00000017  xor         edi,edi
00000019  xor         edi,edi
     A a;
0000001b  mov         ecx,3696CD8h
00000020  call        FD2FE2C4
00000025  mov         esi,eax
00000027  mov         ecx,esi
00000029  call        dword ptr ds:[03696D10h]
0000002f  mov         edi,esi
     a.a() = 15;
00000031  mov         ecx,edi
00000033  call        dword ptr ds:[03696D0Ch]
00000039  mov         esi,eax
0000003b  mov         dword ptr [esi],0Fh 
}
00000041  nop
00000042  pop         esi
00000043  pop         edi
00000044  ret

И снова никаких TypedReference, после JIT остались одни "голые" указатели

> И эффектиность этого дела, по словам народа копающегося в ЖЦ, далека от прямых ссылок.


Как можно заметить, эффективность самих операций вполне нормальная. По сути прямые ссылки (точнее, указатели) и есть.
Posted via RSDN NNTP Server 2.0 alpha
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[18]: C# - необходимость?
От: Павел Кузнецов  
Дата: 17.02.05 16:20
Оценка:
Sinclair,

> Поэтому единственный способ генерировать валидируемый мсил, оставляя возможности возврата ссылок из методов — это инлайнить все такие методы.


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

> ПК>Вполне можно было ввести этот контроль при проверке определения соответствующей функции, просто им лень стало это делать:


> Ну, я вот не уверен, что проблема только в лени. Возможно, они имели в виду фатальные последствия для производительности, в связи с отсутствием возможности статической проверки.


Вот пример алгоритма: http://www.nesterovsky-bros.com/html/css2/Byref%20verification.html

> Кстати, вообще правила верификации MSIL разрабатывались таким образом, чтобы, к примеру, гарантированно можно было построить однопроходный верификатор. И я подозреваю — неспроста.


Алгоритм выше, по крайней мере на первый взгляд, вполне вписывается в эти условия...
Posted via RSDN NNTP Server 2.0 alpha
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[22]: C# - необходимость?
От: Павел Кузнецов  
Дата: 17.02.05 16:32
Оценка:
Sinclair,

> S> И чем это плохо????


> Плохо тем, что это не верифицируется. Потому, что нет способа убедиться, что ты вернул из пользовательского кода не просто управляемый указатель, а управляемый указатель на валидный объект.


Подозреваю, что это не совсем так. Стандарт CLI не требует верифицировать подобное использование managed pointers, но это не означает, что некоторая реализация не сможет этого делать. Более того, стандарт явным образом разрешает реализациям расширять правила, определяющие что есть verifiable code. Полагаю, что реализация от Microsoft делает что-то в таком роде, т.к. C++/CLI замечательно компилирует возврат "правильных" managed pointers в режиме /clr:safe. При этом на возврат "неправильного" managed pointer (например, указывающего на стек):
int% A::a()
{
     int i;
     return i;
}

ругается таким образом:
d:\users\pavel\test\cli\cpp_cli\a.cpp(9) : error C4801:
     Return by reference is not verifiable: gc-lvalue is from an unknown source
Posted via RSDN NNTP Server 2.0 alpha
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[15]: C# - необходимость?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 17.02.05 16:36
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

Не так не интересно
ПК>void C::test()
ПК>{
ПК> A a;
int% b=a.a();

// что то делаем создаем объекты вызываем GC.Collect

b = 15;
ПК>
ПК>}
ПК>[/c]
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
и солнце б утром не вставало, когда бы не было меня
Re[23]: C# - необходимость?
От: Павел Кузнецов  
Дата: 17.02.05 16:42
Оценка:
P.S.

> стандарт явным образом разрешает реализациям расширять правила, определяющие что есть verifiable code. Полагаю, что реализация от Microsoft делает что-то в таком роде, т.к. C++/CLI замечательно компилирует возврат "правильных" managed pointers в режиме /clr:safe.


Да, кстати, вызовы этих функций тоже замечательно компилируются в режиме /clr:safe. Добавляю это замечание, т.к. по "стандартному" алгоритму неверифицируемыми считаются именно вызовы.
Posted via RSDN NNTP Server 2.0 alpha
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[16]: C# - необходимость?
От: Павел Кузнецов  
Дата: 17.02.05 16:58
Оценка:
Serginio1,

> Не так не интересно

> ПК>void C::test()
> ПК>{
> ПК> A a;
> int% b=a.a();
>
> // что то делаем создаем объекты вызываем GC.Collect
>
> b = 15;
> ПК>
> ПК>}
> ПК>[/c]

Легко (при этом, замечу, компилируемся в режиме /clr:safe):
void C::test()
{
     A a;
     int% b = a.a();

     array<A^>^ arr = gcnew array<A^>(100);

     for ( int i = 0; i < 100; ++i )
         arr[i] = gcnew A();

     for ( int i = 0; i < 100; ++i )
         arr[i] = gcnew A();

     GC::Collect();

     b = 15;
}


.method public static void test() cil managed
{
       // Code Size: 79 byte(s)
       .maxstack 3
       .locals (
             int32 num1,
             int32 num2,
             cpp_cli.A[] aArray1,
             int32& numRef1,
             cpp_cli.A a1)
       L_0000: newobj instance void cpp_cli.A::.ctor()
       L_0005: stloc.s a1
      L_0007: ldloc.s a1
       L_0009: call instance int32& cpp_cli.A::a()
       L_000e: stloc.3
       L_000f: ldc.i4.s 100
       L_0011: newarr cpp_cli.A
       L_0016: stloc.2
       L_0017: ldc.i4.0
       L_0018: stloc.1
       L_0019: br.s L_001f
       L_001b: ldloc.1
       L_001c: ldc.i4.1
       L_001d: add
       L_001e: stloc.1
       L_001f: ldloc.1
       L_0020: ldc.i4.s 100
       L_0022: bge.s L_002e
       L_0024: ldloc.2
       L_0025: ldloc.1
       L_0026: newobj instance void cpp_cli.A::.ctor()
       L_002b: stelem.ref
       L_002c: br.s L_001b
       L_002e: ldc.i4.0
       L_002f: stloc.0
       L_0030: br.s L_0036
       L_0032: ldloc.0
       L_0033: ldc.i4.1
       L_0034: add
       L_0035: stloc.0
       L_0036: ldloc.0
       L_0037: ldc.i4.s 100
       L_0039: bge.s L_0045
       L_003b: ldloc.2
       L_003c: ldloc.0
       L_003d: newobj instance void cpp_cli.A::.ctor()
       L_0042: stelem.ref
       L_0043: br.s L_0032
       L_0045: call void [mscorlib]System.GC::Collect()
      L_004a: ldloc.3
       L_004b: ldc.i4.s 15
       L_004d: stind.i4
       L_004e: ret
}


void C::test()
{
     A a;
00000000  sub         esp,8
00000003  push        edi
00000004  push        esi
00000005  push        ebx
00000006  push        ebp
00000007  test        dword ptr [esp+FFFFFBC0h],eax
0000000e  cmp         dword ptr ds:[001DB7C4h],0
00000015  je          0000001C
00000017  call        760C4305
0000001c  xor         edi,edi
0000001e  xor         esi,esi
00000020  xor         ebp,ebp
00000022  mov         dword ptr [esp+10h],0
0000002a  mov         dword ptr [esp+14h],0
00000032  mov         ecx,3696370h
00000037  call        FD2FEC94
0000003c  mov         ebx,eax
0000003e  mov         ecx,ebx
00000040  call        dword ptr ds:[036963A8h]
00000046  mov         dword ptr [esp+14h],ebx
    int% b = a.a();
0000004a  mov         ecx,dword ptr [esp+14h]
0000004e  call        dword ptr ds:[036963A4h]
00000054  mov         ebx,eax
00000056  mov         dword ptr [esp+10h],ebx 

     array<A^>^ arr = gcnew array<A^>(100);
0000005a  mov         edx,64h
0000005f  mov         ecx,37494AAh
00000064  call        FD2FEE24
00000069  mov         ebp,eax

     for ( int i = 0; i < 100; ++i )
0000006b  xor         esi,esi
0000006d  jmp         00000070
0000006f  inc         esi
00000070  cmp         esi,64h
00000073  jge         00000095
         arr[i] = gcnew A();
00000075  mov         ecx,3696370h
0000007a  call        FD2FEC94
0000007f  mov         ebx,eax
00000081  mov         ecx,ebx
00000083  call        dword ptr ds:[036963A8h]
00000089  push        ebx
0000008a  mov         edx,esi
0000008c  mov         ecx,ebp
0000008e  call        75EBBBF8
00000093  jmp         0000006F

     for ( int i = 0; i < 100; ++i )
00000095  xor         edi,edi
00000097  jmp         0000009A
00000099  inc         edi
0000009a  cmp         edi,64h
0000009d  jge         000000BF
         arr[i] = gcnew A();
0000009f  mov         ecx,3696370h
000000a4  call        FD2FEC94
000000a9  mov         ebx,eax
000000ab  mov         ecx,ebx
000000ad  call        dword ptr ds:[036963A8h]
000000b3  push        ebx
000000b4  mov         edx,edi
000000b6  mov         ecx,ebp
000000b8  call        75EBBBF8
000000bd  jmp         00000099

     GC::Collect();
000000bf  call        7534D2DC

    b = 15;
000000c4  mov         eax,dword ptr [esp+10h]
000000c8  mov         dword ptr [eax],0Fh 
}
000000ce  nop
000000cf  pop         ebp
000000d0  pop         ebx
000000d1  pop         esi
000000d2  pop         edi
000000d3  add         esp,8
000000d6  ret


Насколько я понимаю, GC замечательно отслеживает managed pointers, находящиеся в стеке, и изменяет их, если нужно. На то они и [b]managed pointers[b] Собственно, это и написано в спецификации.
Posted via RSDN NNTP Server 2.0 alpha
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[17]: C# - необходимость?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 17.02.05 17:05
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

void C::test()
{

array<A^>^ arr = gcnew array<A^>(100);
A^ a= gcnew A();
int% b = a.a();

array<A^>^ arr = gcnew array<A^>(100);

for ( int i = 0; i < 100; ++i )
arr[i] = gcnew A();

for ( int i = 0; i < 100; ++i )
arr[i] = gcnew A();

GC::Collect();

b = 15;
}

а это стековая переменная
Интересно посмотреть на ссылку экземпляра класса. Так как он должен поддвергнуться сборке мусора
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
и солнце б утром не вставало, когда бы не было меня
Re[18]: C# - необходимость?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 17.02.05 17:21
Оценка:
Здравствуйте, Serginio1, Вы писали:

Да еще. Лучше вызывать метод в котором будут порждаться и собираться мусор, желателлно с некоторой сортировкой массива объектов для изменения ссылок. Причем после сбороа мусора повторить операцию (на райт бариер за одно посмотреть). Что бы крыша у GC съехала. А в таком виде GC достаточно хорошо оптимизирует
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
и солнце б утром не вставало, когда бы не было меня
Re[18]: C# - необходимость?
От: Павел Кузнецов  
Дата: 17.02.05 17:22
Оценка:
Serginio1,

> <...>

>
> а это стековая переменная

Нет, это экземпляр ref класса. Просто C++/CLI позволяет не писать gcnew, если использовать синтаксис "как будто в стеке" для ref классов.

> Интересно посмотреть на ссылку экземпляра класса. Так как он должен поддвергнуться сборке мусора


Попробовал. В этом примере значения b одинаковы в начале и конце функции. При этом указывают они туда, куда надо: a->a() при записи в b меняется соответствующим образом.
Posted via RSDN NNTP Server 2.0 alpha
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[19]: C# - необходимость?
От: Павел Кузнецов  
Дата: 17.02.05 17:24
Оценка:
Serginio1,

> Да еще. Лучше вызывать метод в котором будут порждаться и собираться мусор, желателлно с некоторой сортировкой массива объектов для изменения ссылок. Причем после сбороа мусора повторить операцию (на райт бариер за одно посмотреть). Что бы крыша у GC съехала. А в таком виде GC достаточно хорошо оптимизирует


Можно конкретный примерчик? Если на C++/CLI непривычно, можешь на C# (за исключением T%, ессно). А то я уже нить потерял...
Posted via RSDN NNTP Server 2.0 alpha
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[20]: C# - необходимость?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 17.02.05 17:49
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

public class IntClass
    { 
        public int value;
        public IntClass(int val)
        {
            value = val;
        }
    }
    
static void sort(IntClass[] IntClassArray)
        {
            // сортировка вставками
            for (int i = 1; i < IntClassArray.Length; i++)
            {
                Int32 L = 0;
                Int32 R = i;
                int key = IntClassArray[i].value;

                while (L < R)
                {
                    int Midl = (L + R) >>1;

                    if (IntClassArray[Midl].value <= key)
                        L = Midl + 1;
                    else
                        R = Midl;
                }

                IntClass temp = IntClassArray[i];

                for (int j = i; j > R; j--)
                    IntClassArray[j] = IntClassArray[j - 1];

                IntClassArray[R] = temp;
            }
        }
        
 public void unsortarray(IntClass[] OrigArray)
        {
            Int32 j, k, tempbuff;
            Random r = new Random(666666);

            for (Int32 i = 0; i < OrigArray.Length; i++)
            {
                j = r.Next(OrigArray.Length - 1);
                k = r.Next(OrigArray.Length - 1);
                tempbuff = OrigArray[j];
                OrigArray[j] = OrigArray[k];
                OrigArray[k] = tempbuff;
            }
        }
        
        test()
        {
         IntClass[] OrigArray = new IntClass[1000000];
          for (i=0; i < OrigArray.length;i++)
              OrigArray[]= new IntClass(i);
                
                int% b=OrigArray[0];
                Gc.Collect();
                
                unsortarray(OrigArray);
                
                Gc.Collect();
                
                unsortarray(OrigArray);
                
                 sort(OrigArray);
                int value=OrigArray[0].x;
                if (i.value<>x) throw
                
                
        
        }

Что то в этом роде
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
и солнце б утром не вставало, когда бы не было меня
Re[21]: C# - необходимость?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 17.02.05 18:02
Оценка: +1
Здравствуйте, Serginio1, Вы писали:

Помоему я там ноликом ошибся 100 хватит за глаза.
http://gzip.rsdn.ru/Forum/?mid=646279
Автор: Serginio1
Дата: 19.05.04
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
и солнце б утром не вставало, когда бы не было меня
Re[19]: C# - необходимость?
От: GlebZ Россия  
Дата: 17.02.05 18:17
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

Что-то я торможу, вы хотите сказать что программа вида:

void C::test()
{
     A a=new gcnew A();
     int% b = a.a();
     a=null;
     GC::Collect();
     b = 15;
}


Возможна????

С уважением, Gleb.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.