有没有人有真正原因,为什么一个宁愿过的sprintf在C++环境stringstream的任何具体的例子吗?而且,如果你在微软世界工作,有什么理由更喜欢sprintf到_snprintf?什么情况下sprintf将优先stringstream?
2
A
回答
4
我用sprintf
所有的时间在C++中。我发现使用起来更容易,特别是当我写时间戳和其他特殊格式的字符串时。当然,你可以使用流修饰符来做到这一点,但是它太冗长了,你一眼就看不到代码的实现。
如果您绝对知道您不会溢出缓冲区,并且您需要尽可能快的写入或者不想让额外的参数混乱,则优先于_snprintf
。
说到缓冲区,这是另一回事......通常我会使用sprintf
或其变体,当我在堆栈上有一个缓冲区或正在写入内存中的现有缓冲区时。我不一定要分配和复制string
对象的开销。
不是说我不使用ostringstream
- 我当然会这么做(尽管我经常使用istringstream
,换个方式)......但我更喜欢用两种工具代替一种。
1
您绝对不希望sprintf
超过数据流,但在某些情况下,您可能会考虑使用snprintf
(或对于MS编译器使用_snprintf
)。
对于那些性能已经被测量的代码适当性能密集型件,snprintf
可能会给你的使用流性能的提升。
此外,如果您已经保留char[]
缓冲区以传递到C API,则可以考虑使用snprintf
。
并且仅仅为了重申,您应该始终偏好_snprintf
或snprintf
而不是sprintf
,因为它们有助于防止各种各样的安全问题和/或难以发现错误。
相关问题
- 1. 为什么sprintf()在这种情况下工作?
- 2. istringstream,ostringstream和stringstream有什么区别? /为什么不在每种情况下使用stringstream?
- 3. 在什么情况下HTTP_REFERER将为空
- 4. 在不使用stringstream的情况下将char *转换为abitrary numeric
- 5. CASE语句SQL:情况优先?
- 6. TransactionScope优先级(摆脱死锁情况)
- 7. C++:这种情况下引用的优点是什么?
- 8. 在这种情况下有什么优点和缺点?
- 9. Javascript原型 - 在这种情况下有什么优势?
- 10. 如何在代码优先的情况下共享EF6对象
- 11. 这种情况下最好的情况是什么?
- 12. 在什么情况/情况下,dynamic_cast <>可能会失败?
- 13. 在什么情况下调用__rmul__?
- 14. fgets()在什么情况下卡住了?
- 15. 在什么情况下document.open()返回null?
- 16. 什么情况下**会有用?
- 17. 在什么情况下CopyOnWriteArrayList适合?
- 18. 为什么在这三种情况下
- 19. 在什么情况下AppDomain.DoCallback()会失败?
- 20. 在什么情况下glGenBuffers/glGenBuffersARB失败?
- 21. “:”在这种情况下做什么?
- 22. 在什么情况下会http.ListenAndServe返回
- 23. sched_yield在这种情况下做什么?
- 24. 有什么用在这种情况下
- 25. 什么是在这种情况下
- 26. 什么是以下情况的查询
- 27. *在这种情况下做什么?:
- 28. ConcurrentBag.TryTake()在什么情况下会失败?
- 29. 为什么在这种情况下
- 30. 在什么情况下使用Django formset?
是“无”有效的答案吗?你可能想把'sprintf'和'_snprintf'问题放在C标签下。 – Xymostech
【产品性能】(http://stackoverflow.com/questions/445315/why-is-snprintf-faster-than-ostringstream-or-is-it)可能,但你必须测量。 –