出于 RAM 优化目的,我需要将数据存储为 std::array<char, N>
其中 N 是数组的“templated size_t”大小。
我需要管理大量包含任何类型数据(数字和字符)的“Line”对象。
所以我的 Line 类是:
template<size_t NByte>
class Line {
public:
Line (std::array<char, NByte> data, std::vector<size_t> offset) :
_data(data), _offset(offset) {}
template<typename T>
T getValue (const size_t& index) const {
return *reinterpret_cast<const T*>(_data.data() + _offset[index]);
}
template<typename T>
void setValue (const size_t& index, const T value) const {
char * new_value = const_cast<char *>(reinterpret_cast<const char *>(&value));
std::move(new_value, new_value + sizeof(T), const_cast<char *>(_data.data() + _offset[index]));
}
private:
std::array<char, NByte> _data;
std::vector<size_t> _offset;
};
我的问题是:
- 有没有更好的方法来实现 setter 和 getter 函数?
- 这对内存泄漏是否可靠?
- 在生产/发布中使用此代码是否有任何问题?
编辑:背后的问题是:是否有任何其他方法可以处理内存中的二进制数据并通过 setter 和 getter 为最终用户提供“人类可理解”的界面?
最佳答案
Is there any problem in using this code in production/release?
是的,这段代码是平台相关的。
Big-Endian 平台和 Little-Endian 平台的数据存储方式不同。
如果您指望两个系统相互通信(传输和接收此数据),那么您将必须确保双方使用相同字节顺序的平台。
关于C++ 将 double 转换为 char 并替换为 std::array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41846723/