为什么预定义流对象的大小因编译器而异

Why sizeof predefined stream objects varies from compiler to compiler?

本文关键字:编译器 预定义 对象 为什么      更新时间:2023-10-16

在你们开始把这篇文章标记为重复之前,我已经读过了。但它没有回答我的问题。

我同意sizeof(int)是C &c++。但是当我在不同的编译器上测试下面的程序时,我感到很惊讶。

#include <iostream>
using std::cout;
int main()
{
    cout << "Sizeof cout object: " << sizeof(cout) << 'n';
    cout << "Sizeof cin object: " << sizeof(std::cin) << 'n';
}

g++ 4.8.1 &4.9.2

size: 140

Sizeof cin object: 144

Visual Studio 2010的输出

size: 80

Sizeof cin object: 88

在线编译器的输出(参见这里的实时演示)

Sizeof cout object: 272

size: 280

我的问题是为什么它是实现定义的行为?为什么不在c++的所有实现上都有相同的大小?如果它们在所有编译器上都有相同的大小,不是吗?我的朋友告诉我,这个决定是由于硬件& &;性能的原因。如果你能在最低层次上深入解释答案,那将会很有帮助。硬件在这里扮演什么角色?如何通过在不同的实现上使用不同大小的类型来获得性能?为什么在尺寸上有这么大的差异?在各种编译器上的上述程序的Cout对象?

因为开发不同编译器的不同的人决定以不同的方式实现它。

也许这些差异可能是由于优化的选择或受平台工作方式的影响。但是,如果不深入分析实现本身及其运行的平台,就很难说得更多。

如果你真的想知道更多,我认为你必须自己深入研究那些实现,并开始询问它们的细节。