C++ 将 double 转换为 char 并替换为 std::array

标签 c++ arrays c++11

出于 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/

相关文章:

c++ - 如何将此类序列化为 XML 或 JSON

c++ - C 风格的转换是否与函数风格的转换相同?

c - C 中的指针和数组,需要更多理解

c++ - 将 8 个字节转换为 double 值

c++11 - GCC、Clang 和 MSVC 中的可变参数模板-模板参数和 sizeof 差异 - 谁是对的?

c++ - std::upper_bound 和 std::lower_bound 的不同比较签名

c++ - g++ 和 boost 中 regex_replace() 替换字符串中 '\' 的不同处理

c++ - 如何在不使用额外空间的情况下检查双向链表是否为回文?

c++ - 如何从另一个类(class)关闭主窗口?

c++ - 混淆 C++ STL 容器 [] 运算符和默认值