Memcpy C ++替代项

问题描述 投票:0回答:2

我正在将Windows 10上的库SDL2与MSVC(aka 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 ++友好的”(在C ++中有效,但在C中不可用)和安全的方式。

c++ input sdl-2
2个回答
0
投票

也许最简单的更改是使用std::copystd::copy而不是std::copy_n。它们是类型安全的,对于您的POD数据类型,它们可能会编译为std::copy_nmemcpy调用,并从那些高度优化的函数中获得快速的收益。

memcpy

memmove

0
投票

由于指针是RandomAccessIterator,并且您具有可用的连续元素数,因此可以使用std::copy(currentkb, currentkb + keylength, prevkb); 的InputIterator ctor:

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

对于现有变量,您也可以使用std::vector<T>

std::vector<T>

或使用移动分配:(最终可能不会有所作为)

const auto * const currentkb = SDL_GetKeyboardState(&keyLength);
std::vector<std::uint8_t> prevkb(currentkb, currentkb + keyLength);
© www.soinside.com 2019 - 2024. All rights reserved.