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
。它们是类型安全的并且具有简单可复制的数据类型,它们可能会编译为 memcpy
或 memmove
调用并获得这些高度优化函数的速度优势。
std::copy(currentkb, currentkb + keylength, prevkb);
或
std::copy_n(currentkb, keylength, prevkb);
我在 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
。它们是类型安全的并且具有简单可复制的数据类型,它们可能会编译为 memcpy
或 memmove
调用并获得这些高度优化函数的速度优势。
std::copy(currentkb, currentkb + keylength, prevkb);
或
std::copy_n(currentkb, keylength, prevkb);