- 论坛徽章:
- 2
|
三次函数调用比一个switch走三次要效率高吗?这个我真没测过,现代CPU上函数调用要不要保存寄存器状态?咱不是计算机专业的,不是很清楚...还有一个疑问就是三次cout导致陷入内核的次数会不会多于printf,也就是三次cout会不会导致缓存上的低效?求牛人给解释下
reiase 发表于 2010-03-13 19:43
我说的"大switch" 个某一个operator <<(T const&) 指的是目标代码的大小。
因为你提到了空间效率。
cout的每次调用, 还有printf的每次调用都不一定会进入内核, 还有缓冲呢。
时间上, 确实没见过有cout体系实现得比printf体系要快。
那是因为cout体系有更多的功能。
如果仅仅是格式化功能:
1. 使用重载,编译时分派
2. 使用格式化字符串,运行时分派
后者肯定比前者慢。
如果是一次仅输出一个域相比对比一次输出多个域, 请看46楼的例子。
scanf的返回值是成功读取数据的个数,但是在cin链上,你用状态检查函数能够检测出第几个读取出错吗?每次调用完cin,要不要都调用状态检查函数得瑟下?或者借用某位老兄的例子,多线程环境下,你用状态检查函数,能检查到啥?要不要先上个锁再调用状态检查函数?生产环境只能用异常吧,不然cin不声不响少读个数据reiase 发表于 2010-03-13 19:43
首先, 多线程根本不是问题。
cin只是会麻烦一些, 需要使用线程局部存储来保存最近一次的状态。
而scanf的返回值是栈上的, 本来就是线程私有的。
可以这么搞:
- stream_with_local_status tmp(cin);
- tmp<< ... << ... << ...
- tmp.status;
复制代码 错误处理, 嘿嘿。 来吧, 我在和你讨论错误处理。
既然你提到scanf, 给你个需求: 如何读入一个行? 行大小未知。
- // delimit为"行"结束符
- char* getline(FILE* f, int delimit);
复制代码 既然提到scanf, 就不得不再提一下sscanf。 再给你一个需求, C89中的。
返回的不是成功读取的个数吗? 我怎么知道读取的字符数?
- char const* s = "12abc12";
- int i1, i2;
- int r = sscanf(s, "%d%d", &i1, &i2);
复制代码 i2肯定读取不到了, 那我如何知道丢弃s中的哪个字符, 并从那开始重新读取i2?
C99我不太了解, 加入了一个%n。 我猜想可能应该是这么使用:
(如果用错, 请指出)
- char const* input = ...;
- char const* input_end = input + strlen(input);
- int i1, i2, n;
- char const* s = input;
- int r = 0;
- while ( r= sscanf(s, "%d%n%d%n", &i1, &n, &i2), r==0 ) {
- if ( s == input_end ) {
- // 输入错误
- }
- ++s; // 忽略一个字符
- }
- if ( r == 1 ) {
- s += n1;
- while ( r= sscanf(s, "%d", &i2), r == 0 ) {
- if ( s == input_end ) {
- // 输入错误
- }
- ++s; 忽略一个字符
- }
- }
- 如果顺利, 读取完毕。
复制代码 考虑错误处理, 如果需要一次性读取3个? 读取4个? 读取5个? 这代码应该怎么写?
你可以写写看, 看会不会变成读取一个, 检查一个; 还是说,依然是一次性读取完毕。
综上, 你总喜欢拿printf/scanf体系的长处去和cout/cin体系的短板相比。
公平吗? printf/scanf的短板你看出来了吗?
还有, 不要想当然。
比如不要想当然的认为每次cout调用就会陷入内核, 比如scanf的错误处理会比cin简单。
—————— python那个例子
对, 这确实很爽~_~
但是, 你用python作例子,去证明C中的printf? 不合适吧?
python确实会很爽, template字符串错了也不会咋样。
printf的template, 错了就等着悲剧吧。
另外, python的print也是可以不使用格式化字符串的OO当然是C++中最不起眼的特性。 你看, ACE不是把事情搞复杂了? |
|