Memcpy C++ 替代品

Memcpy C++ alternative

我在 Windows 10 上将库 SDL2 与 MSVC(也称为 Visual C++)编译器一起用于个人项目。我在尝试处理输入时遇到了麻烦。 代码如下,出处来自here:

// 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);
}

// ...

我想在不使用 memcpy 的情况下将数据从 currentkb 复制到 prevkb,并且可能使用更"C++ friendly"(在 C++ 中有效但在 C 中无效)和安全的方式。

由于指针是 RandomAccessIterator 并且您有可用的连续元素的数量,您可以使用 std::vector<T> 的 InputIterator ctor:

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);

也许最简单的更改是使用 std::copy or std::copy_n 而不是 memcpy。它们是类型安全的并且具有简单可复制的数据类型,它们可能会编译为 memcpymemmove 调用并获得这些高度优化函数的速度优势。

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

std::copy_n(currentkb, keylength, prevkb);