Memcpy C++替代方案

Memcpy C++ alternative

本文关键字:方案 C++ Memcpy      更新时间:2023-10-16

我正在使用带有MSVC的Windows 10上的库SDL2(又名。个人项目的可视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);
}
// ...

我想在不使用memcpy的情况下将数据从currentkb复制到prevkb,并且可能使用更"C++友好"(在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::copystd::copy_n而不是memcpy。它们是类型安全的,并且具有易于复制的数据类型,它们可能会编译为memcpymemmove调用,并获得这些高度优化函数的速度优势。

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

std::copy_n(currentkb, keylength, prevkb);
相关文章: