考虑以下计划:
#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
类型,这就是为什么我在这里得到相同的输出。对?这些大小编译器是否依赖?
答案 0 :(得分:1)
基本上,它归结为iostream有相当多的状态存储,但字符串很少。
尽管如此,大小只有4的字符串的想法有点令人惊讶(至少对我而言)。我通常期望32位实现为12,或64位版本为24。
特别是,字符串通常包含三个内容:指向实际缓冲区以保存数据的指针(通常在免费存储区中分配),size_t包含该缓冲区的大小,size_t包含该数字当前存储的字符数。在典型情况下,每个都在32位实现上为32位,在64位实现上为64位。
完全有可能证明一个比这个更大的字符串对象 - 例如,将一个小字符串的数据直接存储在字符串对象本身中是很常见的(“短字符串优化”)。在这种情况下,您可能在字符串对象本身中有(最多)20个字符的空间,这通常会进一步增加其大小。