2015-08-07 2 views
1

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

Но скажем, у меня есть short[] и char[]. Вы не можете сделать Array.Copy между ними, потому что они не одного типа, , но элементы в них имеют одинаковый размер, i.e. sizeof(short) == sizeof(char). Как обойти ограничение типа, чтобы сделать memcpy от short[] до char[], не делая цикл for? Я говорю о чем-то, что было бы логическим эквивалентом reinterpret_cast<> в C++.

TL; Если два массива имеют элементы одинакового размера, можете ли вы манипулировать ими, чтобы скопировать элементы между ними быстрее? У вас всегда может быть цикл for, но я ищу нечто вроде прямого memcpy из одного массива в другой.


Кроме того, я хотел бы отметить еще один раз, для петель не будет принято. Я им хорошо знаком, но это вопрос производительности, спрашивающий, есть ли более эффективный способ сделать это.

+1

Вы пробовали Buffer.BlockCopy? –

+1

Может захотеть обратиться: http://stackoverflow.com/a/3783189 – nawfal

+1

@KellyEthridge && nawfal: Ну, я думаю, вы, ребята, просто ответили на мой вопрос ... –

ответ

1

Вы можете использовать Buffer.BlockCopy. В отличие от Array.Copy, он копирует базовые байты массива в пункт назначения. Так, например, short состоит из 2 байтов. Пустой short[] 5 может выглядеть следующим образом:

    1 short (0x0000) 
         ˅˅˅˅ 
    0000 0000 0000 0000 0000 
     ^^   ^^ 
    1 byte (0x00) Byte #8 (byte index 7) 

Между тем, скажем, у нас есть byte[], на этот раз с 10 индексами. Это будет выглядеть примерно так:

       Last byte [9] 
            ˅˅ 
     AF C0 24 19 05 67 F9 D7 24 B3 
     ^^ 
    First byte [0] 

Теперь, обратите внимание, что эти массивы точно такой же размер: short[] 5 х 2 байта, в то время как byte[] составляет 10 х 1. Таким образом, если мы побежали Buffer.BlockCopy(bytes, 0, shorts, 0, bytes.Length), который по существу копируют байткоды из bytes в shorts, шорты станут:

AFC0 2419 0567 F9D7 24B3 

Так что да, это по существу то, что Buffer.BlockCopy does- копирует основные байт массива.


Некоторых советы:

  • Используйте массив с меньшим размером элементами для получения счета. Например, если бы я использовал shorts.Length в качестве последнего параметра в приведенном выше примере, мне пришлось бы умножить его на sizeof(short) или он будет копировать только половину массива.

  • BlockCopy не работает с примитивами.

 Смежные вопросы

  • Нет связанных вопросов^_^