Передача трехмерного массива C # в библиотеку C ++ в виде 1-байтового массива

У меня есть приложение C #, где я создал массив 3D Int16 (короткий). Хотите передать этот трехмерный массив в библиотеку c ++, чтобы установить эти данные для объекта в виде одномерного байтового массива. Таким образом, сценарии состоят в том, чтобы либо преобразовать их перед передачей данных в библиотеку, либо преобразовать их в самой библиотеке.

  • Я знаю, как преобразовать массив 3D Int16 в массив 1D байтов в C #, но я не знаю, как преобразовать его с помощью C ++?
  • Какой из них будет быстрее C ++ или C #, относительно того, что я использую ConvertAll в C #?
  • Будет ли память удвоена, или я могу просто установить данные объекта в библиотеке C ++ так, чтобы они указывали на тот же том, что и в C #?

1

Решение

Я знаю, как преобразовать массив 3D Int16 в массив 1D байтов в C #, но я
не знаете, как конвертировать его с помощью C ++?

Это зависит от того, как вы хотите, чтобы строки, столбцы и глубина располагались в одномерном массиве. Я не вижу смысла конвертировать его, так как вы можете просто получить произвольный доступ к элементам так, как вам нужно. Нет оснований брать на себя расходы на такую ​​операцию, когда вам это не нужно. Если вы не храните это в файле или не отправляете по сети, я не могу понять, почему вы захотите его сериализовать.

Почему вы не можете сделать что-то вроде:

__declspec( dllexport ) void cppMatrixCode(__int16*** matrix_3d, int width, int height, int depth)
{
//manipulate the matrix with matrix_3d[the row you want][col you want][depth you want]

//or to serialize:
for(int i = 0; i < width; i++)
for(int j = 0; j < height; j++)
for(int k = 0; k < depth; k++)
{
_int16 value = matrix_3d[i][j][k];
//now add value to another array or whatever you want.
}
}

in C#
[DllImport("YourDLLGoesHere")]
static extern void cppMatrixCode(short[,,] matrix_3d, int width, int height, int depth);

short[,,] matrix = new short[width, height, depth];
//add your values to matrix
cppMatrixCode(matrix, width, height, depth);

Это должно копировать только 128 байтов в 32-битной системе или 160 байтов в 64-битной системе.

Какой из них будет быстрее C ++ или C #, учитывая, что я использую ConvertAll в
C #?

Это зависит от того, что конкретно вы делаете, но хорошо написанный код C ++ обычно быстрее, чем код CLI.

Будет ли память удвоена, или я могу просто установить данные объекта в
библиотеку C ++, чтобы указать на тот же объем, который у меня есть в C #?

Вы должны быть в состоянии передать C # byte [] в функцию c ++ по ссылке и без копирования каких-либо данных. Еще раз, нам нужны более подробные сведения о том, что именно вы пытаетесь сделать.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]