Безопасное индексирование внутри небезопасного кода
Доброе утро, день или ночь,
Предисловие: приведенный ниже код ничего не дает. Это просто для целей объяснения.
Что-то не так с выделением и использованием массива "безопасный режим" внутри небезопасного кода? Например, я должен написать свой код как
public static unsafe uint[] Test (uint[] firstParam, uint[] secondParam)
{
fixed (uint * first = firstParam, second = secondParam)
{
uint[] Result = new uint[firstParam.Length + secondParam.Length];
for (int IndTmp = 0; IndTmp < firstParam.Length; Result[IndTmp] = *(first + IndTmp++));
for (int IndTmp = 0; IndTmp < secondParam.Length; Result[IndTmp + firstParam.Length] = *(second + IndTmp++);
return Result;
}
}
или я должен вместо этого написать отдельный, небезопасный метод, принимающий только указатели и длины в качестве параметров, и использовать его в основной функции?
Кроме того, есть ли способ заменить распределение на
uint * Result = stackalloc uint[firstParam.Length + secondParam.Length]
так что я могу использовать Result
в качестве указателя и по-прежнему сможет вернуть Result
как uint[]
?
Большое спасибо.
1 ответ
Я не вижу в этом ничего плохого, хотя если вы используете указатели для скорости, возможно, имеет смысл использовать указатель на Result
также. Может быть так:
public static unsafe uint[] Test (uint[] firstParam, uint[] secondParam)
{
uint[] Result = new uint[firstParam.Length + secondParam.Length];
fixed (uint * first = firstParam, second = secondParam, res = Result)
{
for (int IndTmp = 0; IndTmp < firstParam.Length; IndTmp++)
*(res + IndTmp) = *(first + IndTmp);
res += firstParam.Length;
for (int IndTmp = 0; IndTmp < secondParam.Length; IndTmp++)
*(res + IndTmp) = *(second + IndTmp++);
}
return Result;
}
НЕ возвращайте ничего, что вы stackalloc
! Как только функция возвращается, область, выделенная в стеке, используется повторно, давая вам неверный указатель.