【问题标题】:C++ Cast double to char and replace into std::arrayC++ 将 double 转换为 char 并替换为 std::array
【发布时间】:2017-01-25 22:04:36
【问题描述】:

出于 RAM 优化的目的,我需要将我的数据存储为 std::array<char, N>,其中 N 是数组的“模板化 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 为最终用户提供“人类可以理解的”界面?

【问题讨论】:

  • 看来你的 getValuesetValue 函数可以被几个 operator[] 重载替换。不过,这无助于使函数中的代码“更好”。另一方面,现在您已经了解了优化代码的缺点:它通常很糟糕。
  • 顺便说一句,如果代码正常工作并且您只想对其进行“审查”(这似乎是您想要的),那么就有codereview.stackexchange.com
  • @StoryTeller: 想念我身边的人:-(
  • @Someprogrammerdude:我对编程世界很陌生,不知道codereview.stackexchange.com。我将把我的问题移到它上面。感谢您的建议!有没有办法把它从 SO 中移走?
  • @Peter:这里没有逗号运算符,正在调用三参数std::move 函数。而且我看不到任何地址存储在任何地方。指针被用作迭代器,这是合法的。 new_value 初始化器中的 const_cast 是伪造的。

标签: c++ arrays c++11


【解决方案1】:

在生产/发布中使用此代码有什么问题吗?

是的,此代码依赖于平台。

数据在 Big-Endian 平台和 Little-Endian 平台中的存储方式不同。

如果您指望两个系统相互通信(传输和接收此数据),那么您必须确保双方使用相同字节序的平台。

【讨论】:

  • 谢谢!但是,我们的代码将在已知平台上运行,并且不会与外部通信。它将数据读/写到文件中。
  • @Elendil:你怎么能确定这个文件在某个时候不会被传递给一些相反的字节序系统?
  • 这是因为这是我们数据管道的要求:我们知道数据中心的确切架构。而且这段代码永远不会跑出那些数据中心。
猜你喜欢
  • 2015-01-09
  • 1970-01-01
  • 2019-07-12
  • 2013-11-28
  • 1970-01-01
  • 2016-10-16
  • 2018-12-27
  • 1970-01-01
  • 2012-05-23
相关资源
最近更新 更多