Безопасное индексирование внутри небезопасного кода - PullRequest
0 голосов
/ 23 марта 2011

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

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

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

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 Ответ

2 голосов
/ 23 марта 2011

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

...