我在一段对性能要求非常高的代码中工作。我需要执行一些格式化的字符串操作,但我正在努力避免内存分配,甚至是内部库分配。
在过去,我会做类似于以下的事情(假设C11):
constexpr int BUFFER_SIZE = 200;
char buffer[BUFFER_SIZE];
int index = 0;
index += snprintf(&buffer[index], BUFFER_SIZE-index, "Part A: %d\n", intA);
index += snprintf(&buffer[index], BUFFER_SIZE-index, "Part B: %d\n", intB);
// etc.
我更喜欢使用所有C方法(例如ostringstream)来执行此操作,而不是旧的C函数。
我意识到我可以使用std::string::reserve和std::ostringstream提前获取空间,但这仍然会执行至少一次分配。
有人有什么建议吗?
提前谢谢你。
感谢所有的建议(甚至在评论中)。
我很欣赏Sjowe的建议,这是解决这个问题的最简单的方法,但我希望这次尝试能做的一件事就是开始为未来的C语言编写代码,不要使用任何不推荐的东西。
我决定采用的解决方案源于Remy Lebeau的评论:
#include <iostream> // For std::ostream and std::streambuf
#include <cstring> // For std::memset
template <int bufferSize>
class FixedBuffer : public std::streambuf
{
public:
FixedBuffer()
: std::streambuf()
{
std::memset(buffer, 0, sizeof(buffer));
setp(buffer, &buffer[bufferSize-1]); // Remember the -1 to preserve the terminator.
setg(buffer, buffer, &buffer[bufferSize-1]); // Technically not necessary for an std::ostream.
}
std::string get() const
{
return buffer;
}
private:
char buffer[bufferSize];
};
//...
constexpr int BUFFER_SIZE = 200;
FixedBuffer<BUFFER_SIZE> buffer;
std::ostream ostr(&buffer);
ostr << "PartA: " << intA << std::endl << "PartB: " << intB << std::endl << std::ends;
有人有什么建议吗?
是的,使用std::ostrstream。我知道它已被弃用。但是我发现它对于输出到静态缓冲区很有用。如果发生异常,内存不可能泄漏。根本没有分配内存。
#include <strstream> // for std::ostrstream
#include <ostream> // for std::ends
// :
constexpr int BUFFER_SIZE = 200;
char buffer[BUFFER_SIZE];
std::ostrstream osout(buffer, sizeof(buffer));
osout << "Part A: " << intA << "Part B: " << intB << std::ends;
我在游标循环中连接varchar2数据类型时遇到了问题。 过程在循环中迭代,以生成用于批处理的插入和删除操作的in子句。该过程将对每1000个帐号批处理运行。 有没有其他方法可以做到这一点?
协议缓冲区说它可以包含任何任意的字节序列。但是如果我的数据包含“\0”,协议缓冲区如何从字符串变量对我的整个数据进行编码。
问题内容: 我有一个Java程序,它将一些文本输出到控制台。它使用,和其他一些方法来执行此操作。 在程序的最后,我想读取控制台中的所有文本并将其复制到String缓冲区中。我该如何用Java做到这一点?我需要阅读和独立。 问题答案: 好的,这是一个有趣的问题。似乎不是一种同时解决所有方法的优雅方法。(不幸的是没有。) 我确实写了一个丑陋的基于反射的解决方法(我想不要在生产代码中使用它:) …可以像
问题内容: 我是Java新手,来自Python。在Python中,我们执行以下字符串格式设置: 如何在Java中复制相同的内容? 问题答案: 该课程看起来像您所追求的。
本文向大家介绍Java中的字符串缓冲区和字符串生成器之间的区别,包括了Java中的字符串缓冲区和字符串生成器之间的区别的使用技巧和注意事项,需要的朋友参考一下 字符串缓冲区和StringBuilder都是可变类,可用于对字符串对象执行操作,例如字符串的反向,压缩字符串等。我们可以在不创建字符串新对象的情况下修改字符串。字符串缓冲区是线程安全的,而字符串生成器不是线程安全的。因此,它比字符串缓冲区快
问题内容: 如何在本地时区中将a 格式化为字符串?以下内容将本地语言转换为UTC,而不是我期望的那样。删除对的调用也是如此。我该如何获取当地时间? 注:我们正在使用的旧版本 0.6.3 中的JSR-310参考实现。 问题答案: 在您否决我的答案之前,请注意,问题明确(以粗体显示)是指 JSR-310参考实现的旧版本 0.6.3 !在Java 8和新的日期库问世之前,我在2012年12月问了这个问题