我正在尝试有效地将映射的内容转换为字符串以通过套接字发送。到目前为止我有这个......
char buffer[1024];
for (iter = my_mapy.begin(); iter != my_map.end();iter++)
{
sprintf(buffer, "%s|%ld|%d", buffer, iter->first, iter->second);
}
虽然这行得通,但我想知道它是否效率低下。 Google 搜索将 int/long/double 转换为字符串的最有效方法,结果是 sprintf,这就是我使用它的原因。但我担心缓冲区的内容被一遍又一遍地复制,而我只想追加到最后。这是正确的吗?如果是这样,是否有更好的方法来做到这一点?性能和速度是第一要务。
谢谢!
最佳答案
你是对的;您在此处提出的解决方案每次都会复制缓冲区。为了做得更好,您将不得不利用 sprintf 的返回值。
char buffer[1024];
char* end_of_buffer = buffer;
std::size_t remaining_space = sizeof(buffer);
for (auto iter = my_map.begin(); iter != my_map.end(); iter++)
{
int written_bytes = snprintf(end_of_buffer, remaining_space, "|%ld|%d", iter->first, iter->second);
if (written_bytes > 0) {
end_of_buffer += written_bytes;
remaining_space -= written_bytes;
} else {
perror("Something is wrong with the buffer");
}
}
请注意,顺便说一句,我使用了 snprintf
,它跟踪缓冲区的剩余长度。你应该总是使用这个而不是不安全的版本。您的应用程序会不断发展,并且通过出色的创造力,您会找到一种方法 来溢出此缓冲区。同时,安全性是零额外成本。
(当然我没有冒犯的意思。)
关于c++ - 在 C++ 中附加到缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9945938/