为什么C++流使用状态位
Why C++ streams use state bits?
我听说当需要更高的性能时会使用C++。C++流使用位的概念来处理意外输入、格式化等。我认为这对性能不好,因为程序必须在每次读写时进行比较。例如,在MSVC中,std::basic_ostream::operator<<(int)
的某些部分实现如下:
if (_Bfl == ios_base::oct || _Bfl == ios_base::hex) {
_Tmp = static_cast<long>(static_cast<unsigned int>(_Val));
} else {
_Tmp = static_cast<long>(_Val);
}
我的问题是,编译器优化是否减少了这些计算?如果不是,为什么C++标准采用状态位的概念?这费用微不足道吗?
对于像cout << std::hex << 1234
这样的格式,我们可以使用这样的格式类:
struct Format
{
std::ostream* optr;
Format&& operator<< (int i) && { ... }
Format&& operator<< (double d) && { ... }
...
template <typename T>
Format&& operator<<(const T& other) && {
(*optr) << other;
return std::move(*this);
}
};
Format&& operator<<(std::ostream& os, Format&& format)
{
format.optr = &os;
return std::move(format);
}
...
std::cout << Format() << 123 << ' ' << 456;
抛开你的想法,甚至stdlib本身的设计/实现都没有考虑到绝对的性能(但在许多情况下是或接近(。流媒体库尤其如此,因为它不是为关键性能而设计的。
相关文章:
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- OSX MetalKit CVMetalTextureCacheCreateTextureFromImage失败,状态:
- std::future_error:无关联状态
- 如何避免LED在循环状态变化中闪烁?
- boost 是否有按特殊类型值编码状态"compact optional"?
- 为什么系统函数总是在C++中返回已转移的退出状态?
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 当可输入框在窗口中处于活动状态时获得通知的任何方法
- 检查两个节点在子节点上是否具有相同状态的更优雅的方法
- 将有状态的 lambda 传递到 C 样式函数中,而无需上下文参数
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 编译问题:在函数"_start"中:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- C++部分概念 id:显式模板规范顺序/第一个参数的特殊状态的原因是什么?
- 试图在崇高中奔跑. 错误 已发生: 收集2.exe: 错误: ld 返回 1 退出状态
- 在容器上移动分配:以前包含的对象的状态
- collect2:错误:ld 返回 1 个退出状态未定义的引用
- 具有动态大小的特征矩阵的默认初始状态
- 如何从Clojure调用C++程序,以使程序保持打开状态?
- q网络回复 无状态码或错误,但失败