sizeof(std :: cout)是140,而sizeof(std :: string)只有4?

时间:2015-07-23 14:46:57

标签: c++ sizeof cout

考虑以下计划:

#include <iostream>
int main()
{
    std::cout<<sizeof(std::string)<<'\n';
    std::cout<<sizeof(std::ostream)<<'\n';
    std::cout<<sizeof(std::istream)<<'\n';
    std::cout<<sizeof(std::cout);
}

我的编译器(g ++ 4.8.1)上的输出是

4

140

144

140

输出真让我困惑。为什么sizeof string类只有4个字节&amp;对于ostream&amp; istream它给140&amp;分别是144个字节? sizeof(std::cout)是140字节,与sizeof(std::ostream)相同。所以,我认为因为cout对象属于ostream类型,这就是为什么我在这里得到相同的输出。对?这些大小编译器是否依赖?

1 个答案:

答案 0 :(得分:1)

基本上,它归结为iostream有相当多的状态存储,但字符串很少。

尽管如此,大小只有4的字符串的想法有点令人惊讶(至少对我而言)。我通常期望32位实现为12,或64位版本为24。

特别是,字符串通常包含三个内容:指向实际缓冲区以保存数据的指针(通常在免费存储区中分配),size_t包含该缓冲区的大小,size_t包含该数字当前存储的字符数。在典型情况下,每个都在32位实现上为32位,在64位实现上为64位。

完全有可能证明一个比这个更大的字符串对象 - 例如,将一个小字符串的数据直接存储在字符串对象本身中是很常见的(“短字符串优化”)。在这种情况下,您可能在字符串对象本身中有(最多)20个字符的空间,这通常会进一步增加其大小。