Memcpy C++替代方案
Memcpy C++ alternative
我正在使用带有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::copy
或std::copy_n
而不是memcpy
。它们是类型安全的,并且具有易于复制的数据类型,它们可能会编译为memcpy
或memmove
调用,并获得这些高度优化函数的速度优势。
std::copy(currentkb, currentkb + keylength, prevkb);
或
std::copy_n(currentkb, keylength, prevkb);
相关文章:
- 运行同一解决方案的另一个项目的项目
- Project Euler问题4的错误解决方案
- 计算每个节点的树高,帮助我解释这个代码解决方案
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- visual c++,如何获取解决方案目录中的代码
- 有没有办法在远程设备上打开和编辑visual Studio 2017解决方案
- C++Matching Brackets 2解决方案不起作用
- 在 ubuntu3 上C++ goto 定义有什么解决方案吗16.04?
- C++11 中不同类型的对象的 std::array 的替代方案
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- 我的固定时间步长与增量时间和插值的解决方案是错误的吗?
- 无法在问题解决方案中执行输出逻辑
- 最大的回文产品 - 程序未运行,编写解决方案但无法理解问题
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- 在一个解决方案中针对第三方静态库 (Creo) 的不同版本(版本)进行构建
- 如何巧妙地编写两个函数——一个用于检查是否存在解决方案,另一个用于获取所有解决方案
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- N-queen问题:无法弄清楚为什么我的解决方案不起作用
- 从排序数组中删除重复项,具有不同代码方式的相同解决方案具有不同的输出