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

时间:2015-08-01 14:41:33

标签: c++ performance language-lawyer

在您开始将此标记为重复之前,我已经阅读了this。但它没有回答我的问题。

我同意 sizeof(int)是C& C中的实现定义行为。 C ++。但是当我在各种编译器上测试以下程序时,我感到很惊讶。

PFQuery *query = [PFQuery queryWithClassName:self.parseClassName];//class name is Score
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
    if (!error) {            
        for (int i = 0; i<=objects.count; i++){
        NSArray *array = [objects objectAtIndex:i];//Selects the first "object" from all the "objects"
        NSNumber *test= [objects objectAtIndex:i];
        array = [array valueForKey:@"highScore"];
        test = [test valueForKey:@"highScore"];               
         test1 = [test intValue];//test1 is the current database object highScore for the current object                        
        }     
    } else {
        // Log details of the failure
        NSLog(@"Error: %@ %@", error, [error userInfo]);
    }
}];

g ++ 4.8.1&amp;的输出4.9.2

cout对象的大小:140

cin对象的大小:144

Visual Studio 2010上的输出

cout对象的大小:80

尺寸cin对象:88

在线编译器输出(参见实时演示here

cout对象的大小:272

cin对象的大小:280

我的问题是为什么它是实现定义的行为?为什么在C ++的所有实现上都没有相同的大小?如果它们在所有编译器上具有相同的大小,那不是吗?我的朋友告诉我,这个决定是由硬件和硬件决定的。表现原因。如果您在最低级别深入解释答案,那将非常有帮助。硬件如何在这里发挥作用?如何通过在不同的实现上使用不同大小的类型来获得性能?为什么cin&amp;的尺寸差别很大?在各种编译器的上述程序中的cout对象?

1 个答案:

答案 0 :(得分:3)

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

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

如果您真的想了解更多信息,我认为您必须亲自深入了解这些实施并开始询问它们的具体细节。