有效地从缓冲区读取值

时间:2015-12-04 09:49:49

标签: c++ c++11 c++14

我在内存中有一个00 00 00 00 00 00 00 00 00 33 2E 31 34 99 99 99 .........3.14™™™ 缓冲区,其中包含一个特定偏移量的数字,例如

std::copy()

我知道结束并开始偏移以读取double / float值,但是现在我将std::string的相关部分复制到std::stod然后调用{{1}} }。我的问题是:我怎样才能让它更快?

必须有办法避免复制..例如:我可以将流指向另一个缓冲区中的特定偏移量吗?或类似的事情

2 个答案:

答案 0 :(得分:0)

如果您知道偏移,那么只需:

vector<char> data;
// ... snip ...
char *endp = null;
double result = strtod(&data[offset],&endp);

注意:这假设数字后跟非数字字符(或字符串结尾)。

答案 1 :(得分:0)

如果数字是分隔的,那么直接在缓冲区上使用strtod就像Let_Me_Be建议的那样有效。但是,由于数字分隔,因此您无法直接使用strtod

如果缓冲区为零(或eof)终止,则可以通过在数字后添加终结符来简单地修改它,然后恢复原始字符,如bolov建议的那样。由于结束偏移是数字的一部分,因此始终至少有终结符,因此offset_end不会溢出。以下代码假定offset_end是最后一个字符的一个。如果它是最后一个字符,那么只需使用+ 1

auto original = data[offset_end];
data[offset_end] = '\0';
auto result = strtod(&data[offset_start], nullptr);
data[offset_end] = original;

即使如果缓冲区没有终止,你仍然可以这样做,但只有当数字不在最后时才会这样做。如果是,或者您不知道缓冲区的结束位置,或者缓冲区是const,那么您当前的解决方案就像它获得的效率一样高。