Безопасное индексирование внутри небезопасного кода

Доброе утро, день или ночь,

Предисловие: приведенный ниже код ничего не дает. Это просто для целей объяснения.

Что-то не так с выделением и использованием массива "безопасный режим" внутри небезопасного кода? Например, я должен написать свой код как

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! Как только функция возвращается, область, выделенная в стеке, используется повторно, давая вам неверный указатель.

Другие вопросы по тегам