Возможно ли сделать быстрое непроверенное приведение структур в C #? - PullRequest
0 голосов
/ 11 мая 2018

Предположим, у вас есть две структуры, которые имеют абсолютно одинаковую структуру памяти.Возможно ли в C # /. NET выполнять очень быструю проверку непроверенной памяти из одной в другую?

//my code base
[StructLayout(LayoutKind.Sequential)]
public struct VectorA
{
    float x;
    float y;
    float z;
}

//defined by a third party library
[StructLayout(LayoutKind.Sequential)]
public struct VectorB
{
    float a;
    float b;
    float c;
}

//somewhere else in my code
var vectorA = new VectorA();

//then calling a method from the library
MethodFromThirdPartyLibrary((VectorB)vectorA); //compiler error

Конечно, это должно быть быстрее как метод, который назначает поля данных и создает новую копиюв памяти.

Также: вектор 3d - это только пример, та же проблема для матриц, которая имеет 16 чисел с плавающей запятой и Vector2, Vector4, ...

РЕДАКТИРОВАТЬ: Улучшен код с болеекомментарии и лучший пример использования.

1 Ответ

0 голосов
/ 11 мая 2018

с чего бы это быстрее? Будет ли это быстрее в C ++, чем написание копии явно, как в C #? Помните, у вас есть только 3 x 32-битные числа, которые вы хотите скопировать из одного места в другое, так что это не совсем подходит для векторизации.

Вероятно, если бы у вас был массив этих структур, вы могли бы получить некоторую скорость, используя векторизованную загрузку / сохранение в развернутом цикле в ассемблере. Но вы не указали этого в вопросе.

Основными издержками здесь, вероятно, является вызов метода, а не присваивание:

static void VecAToB(ref VectorA vectorA, ref VectorB vectorB)
{
    vectorB.x = vectorA.a;
    vectorB.y = vectorA.b;
    vectorB.z = vectorA.c;
}

Вы можете попробовать:

[MethodImpl(MethodImplOptions.AggressiveInlining)]
static void VecAToB(ref VectorA vectorA, ref VectorB vectorB)
{
    vectorB.x = vectorA.a;
    vectorB.y = vectorA.b;
    vectorB.z = vectorA.c;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...