printf()和cout在c++中的区别是什么?
当前回答
我想指出的是,如果你想在c++中使用线程,如果你使用cout,你可以得到一些有趣的结果。
考虑下面的代码:
#include <string>
#include <iostream>
#include <thread>
using namespace std;
void task(int taskNum, string msg) {
for (int i = 0; i < 5; ++i) {
cout << "#" << taskNum << ": " << msg << endl;
}
}
int main() {
thread t1(task, 1, "AAA");
thread t2(task, 2, "BBB");
t1.join();
t2.join();
return 0;
}
// g++ ./thread.cpp -o thread.out -ansi -pedantic -pthread -std=c++0x
现在,输出都被打乱了。它也可以产生不同的结果,试着执行几次:
##12:: ABABAB
##12:: ABABAB
##12:: ABABAB
##12:: ABABAB
##12:: ABABAB
你可以使用printf,也可以使用互斥。
#1: AAA
#2: BBB
#1: AAA
#2: BBB
#1: AAA
#2: BBB
#1: AAA
#2: BBB
#1: AAA
#2: BBB
玩得开心!
其他回答
对于原语,使用哪个原语可能并不重要。当你想输出复杂的对象时它才有用。
例如,如果你有一门课,
#include <iostream>
#include <cstdlib>
using namespace std;
class Something
{
public:
Something(int x, int y, int z) : a(x), b(y), c(z) { }
int a;
int b;
int c;
friend ostream& operator<<(ostream&, const Something&);
};
ostream& operator<<(ostream& o, const Something& s)
{
o << s.a << ", " << s.b << ", " << s.c;
return o;
}
int main(void)
{
Something s(3, 2, 1);
// output with printf
printf("%i, %i, %i\n", s.a, s.b, s.c);
// output with cout
cout << s << endl;
return 0;
}
现在,上面的内容可能看起来并不是很好,但是让我们假设您必须在代码中的多个地方输出这些内容。不仅如此,假设您添加了一个字段“int d”。使用cout,您只需要在一个地方更改它。然而,使用printf,你可能需要在很多地方改变它,不仅如此,你还需要提醒自己输出哪些。
尽管如此,使用cout,您可以减少大量用于维护代码的时间,不仅如此,如果您在新应用程序中重用对象“Something”,您实际上不必担心输出。
我引用一下:
在高层术语中,主要的区别是类型安全(cstdio 没有它),性能(大多数iostreams实现都有 比cstdio慢)和可扩展性(iostreams允许 自定义输出目标和用户定义类型的无缝输出)。
更多的差异: "printf"返回一个整数值(等于打印的字符数),"cout"不返回任何东西
And.
Cout << "y = " << 7;不是原子的。
Printf ("%s = %d", "y", 7);是原子的。
Cout执行类型检查,printf不执行。
iostream中没有% d的等价物
一个是输出到标准输出的函数。另一个是一个对象,它提供了几个成员函数和输出到stdout的操作符<<的重载。我可以列举更多的不同之处,但我不确定你想要的是什么。
TL;DR:在相信在线随机评论之前,一定要自己做研究,考虑生成的机器代码的大小、性能、可读性和编码时间,包括这一条。
我不是专家。我碰巧听到两个同事在讨论如何避免在嵌入式系统中使用c++,因为会导致性能问题。有趣的是,我基于一个真实的项目任务做了一个基准测试。
在该任务中,我们必须向RAM写入一些配置。喜欢的东西:
咖啡=热 糖=没有 牛奶=乳房 mac = AA: BB: CC:弟弟:EE: FF
这是我的基准测试程序(是的,我知道OP询问printf(),而不是fprintf()。试着捕捉本质,顺便说一下,OP的链接指向fprintf()。)
C程序:
char coffee[10], sugar[10], milk[10];
unsigned char mac[6];
/* Initialize those things here. */
FILE * f = fopen("a.txt", "wt");
fprintf(f, "coffee=%s\nsugar=%s\nmilk=%s\nmac=%02X:%02X:%02X:%02X:%02X:%02X\n", coffee, sugar, milk, mac[0], mac[1],mac[2],mac[3],mac[4],mac[5]);
fclose(f);
c++程序:
//Everything else is identical except:
std::ofstream f("a.txt", std::ios::out);
f << "coffee=" << coffee << "\n";
f << "sugar=" << sugar << "\n";
f << "milk=" << milk << "\n";
f << "mac=" << (int)mac[0] << ":"
<< (int)mac[1] << ":"
<< (int)mac[2] << ":"
<< (int)mac[3] << ":"
<< (int)mac[4] << ":"
<< (int)mac[5] << endl;
f.close();
我尽了最大努力打磨它们,然后把它们都绕了10万次。以下是调查结果:
C程序:
real 0m 8.01s
user 0m 2.37s
sys 0m 5.58s
c++程序:
real 0m 6.07s
user 0m 3.18s
sys 0m 2.84s
目标文件大小:
C - 2,092 bytes
C++ - 3,272 bytes
结论:在我非常特定的平台上,使用非常特定的处理器,运行非常特定版本的Linux内核,运行一个非常特定版本的GCC编译的程序,以完成一个非常特定的任务,我会说c++方法更适合,因为它运行得更快,可读性更好。另一方面,C提供了小的内存占用,在我看来,这几乎没有什么意义,因为程序大小不是我们所关心的。
记住,YMMV。