У меня есть унаследованного кода, который скопировать родной массив в управляемом один:бесполезно pin_ptr при копировании массива
float* nativeValues = new float[NumberOfSamples];
array<double>^ managedValues = gcnew array<double>(NumberOfSamples);
pin_ptr<double> pinnedValues = &managedValues[0];
for (int i = 0; i < managedValues->Length; i++)
{
nativeValues[i] = (float) pinnedValues[i];
}
Я не могу реорганизовать его Runtime::InteropServices::Marshal::Copy
, потому что исходный массив является двойной и цель одна плавать.
Моя проблема: я не понимаю почему pin_ptr. Я не думаю, что это необходимо, но это критический фрагмент кода, и я бы хотел убедиться, прежде чем удалять его.
Считаете ли вы безопасным его удаление?
Я понимаю, что пиннинг понадобится, если я получаю доступ к управляемому массиву с помощью арифметики указателей. Но это просто использование индексатора, так что это не должно быть важно, если GC запускает и перемещает вещи вокруг – ekt