Memcpy C ++ альтернатива - PullRequest
       6

Memcpy C ++ альтернатива

0 голосов
/ 25 января 2020

Я использую библиотеку SDL2 на Windows 10 с компилятором MSV C (он же Visual C ++) для личного проекта. У меня проблемы при попытке ввода. Код выглядит следующим образом, и его происхождение происходит от здесь :

// InputManager.hpp

#include <SDL2/SDL.h>

class InputManager
{
public:
    static InputManager *This();
    // ... 

private:
    InputManager(); // this is a singleton class.

    const Uint8* currentkb;
    Uint8* prevkb;
    int keyLength;
    // ...
};
// InpuManager.cpp

InputManager* InputManager::This()
{
    static InputManager ret;
    return ret;
}

InputManager::InputManager()
{
    currentkb = SDL_GetKeyboardState(&keyLength);
    prevkb = new Uint8[keyLength];
    memcpy(prevkb, currentkb, keylength);
}

// ...

Я хочу выполнить копирование данных из currentkb в prevkb без использования memcpy и, возможно, используйте более дружественный к C ++ (который работает в C ++, но не в C) и безопасный способ.

Ответы [ 2 ]

0 голосов
/ 26 января 2020

Возможно, самое простое изменение - использовать std::copy или std::copy_n вместо memcpy. Они безопасны по типу, и с тривиально копируемыми типами данных они, вероятно, скомпилируются в вызов memcpy или memmove и получат преимущество в скорости этих высокооптимизированных функций.

std::copy(currentkb, currentkb + keylength, prevkb);

или

std::copy_n(currentkb, keylength, prevkb);
0 голосов
/ 25 января 2020

Поскольку указатели являются RandomAccessIterator и у вас есть количество доступных последовательных элементов, вы можете использовать ctor InputIterator std::vector<T>:

const auto * const currentkb = SDL_GetKeyboardState(&keyLength);
std::vector<std::uint8_t> prevkb(currentkb, currentkb + keyLength);

Для существующих переменных вы также можете использовать std::vector<T>::assign:

prevkb.assign(currentkb, currentkb + keyLength);

Или используйте назначение перемещения: (Это, вероятно, не будет иметь значения в конце)

prevkb = decltype(prevkb)(currentkb, currentkb + keyLength);
...