У меня есть приложение C #, где я создал массив 3D Int16 (короткий). Хотите передать этот трехмерный массив в библиотеку c ++, чтобы установить эти данные для объекта в виде одномерного байтового массива. Таким образом, сценарии состоят в том, чтобы либо преобразовать их перед передачей данных в библиотеку, либо преобразовать их в самой библиотеке.
ConvertAll
в C #?Я знаю, как преобразовать массив 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 ++ по ссылке и без копирования каких-либо данных. Еще раз, нам нужны более подробные сведения о том, что именно вы пытаетесь сделать.
Других решений пока нет …