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