【发布时间】:2011-04-27 04:35:28
【问题描述】:
我正在尝试直接写入 fstream 输出缓冲区以避免memcpy。
为什么下面的代码不起作用?
它在 Linux 上编译、运行并生成正确长度的输出文件。但输出文件不包含正确的文本。另请注意,由于某种原因,当我注释掉涉及str2 的两行时,会生成一个长度为零的输出文件。
注意:这个例子没有避免memcpy,但如果它有效,它将帮助我在我的应用程序中避免memcpy。
#include <fstream>
int main(int argc, char *argv[]) {
std::fstream out;
char buffer[512];
out.rdbuf()->pubsetbuf(buffer, 512);
out.open("file.txt", std::fstream::out);
char *str1 = "test text.";
strcpy(buffer, str1);
out.rdbuf()->pubseekpos(strlen(str1), std::ios_base::out);
char *str2 = "why?";
out << str2;
out.flush();
out.close();
}
【问题讨论】:
-
to avoid a memcpy-- 抱歉,这很愚蠢。memcpy是最快的操作之一。 -
您确定
memcpy的成本与实际完成的I/O 成本相比实际上很重要吗?你剖析过吗?这可能只是一个过早的优化,您应该将精力集中在其他地方。 -
关于“为什么”我这样做有几个问题。让我们暂时忽略这些。底线是代码不会生成带有文本的输出文件:“测试文本。为什么?”谁能告诉我为什么?
-
@Xeo:你回答一个没有被问到的问题不仅很烦人,而且你也错了。虽然 memcpy() 速度很快,但它的成本是可衡量的,消除它可以产生显着的性能优势,比如我在我编写的解析器中测量的 10% 的优势:article.gmane.org/gmane.comp.lang.lua.general/77955
-
@Josh:“通过回答” - 我把它作为评论完全是因为它不是一个答案。
标签: c++ linux fstream buffered