繁体   English   中英

在不同版本的gcc上有不同的结果

[英]Have different result at different versions of gcc

比较两个代码如下:

  1 #include <new>
  2 #include <cstdio>
  3 class CA
  4 {
  5 public:
  6     int i, j, k;
  7 };  
  8 
  9 int main()
 10 {
 11     int aa[4] = { 1, 2, 3, 4 };
 12     CA *i = new(aa) CA();
 13     printf("%d %d %d %d\n", aa[0], aa[1], aa[2], aa[3]);
 14     return 0;
 15 }   

  1 #include <new>
  2 #include <cstdio>
  3 class CA
  4 {
  5 public:
  6     int i, j, k;
  7 };  
  8 
  9 int main()
 10 {
 11     int aa[4] = { 1, 2, 3, 4 };
 12     CA *i = new(aa) CA;
 13     printf("%d %d %d %d\n", aa[0], aa[1], aa[2], aa[3]);
 14     return 0;
 15 }   

第12行的差异。在gcc4.1.2的环境中,这两个代码将得到相同的结果1 2 3 4但是在gcc4.4和gcc4.5中,第一个代码将得到0 0 0 4

为什么?

首先,不同版本的GCC具有不同级别的标准合规性。

在这种情况下,更高版本“更正确” - 值初始化必须在第一个片段中进行(因为您隐式调用具有POD成员变量的类的默认编译器生成的构造函数),这将导致类CA的成员变量初始化为零。 请参阅用户Michael Burr的 这个非常详细的答案以及对一个密切相关的问题的 答案

这是新的安置。 您将CA类型的对象初始化为该内存,并且i,j和k的默认值为零,因此aa [0],aa [1]和aa [2]变为零。

我倾向于认为两者都是正确的。 你已经覆盖了int aa[4]使用的内存(部分),然后尝试访问该数组。 这是不正确的:内存包含CA对象,必须通过该类型或兼容类型进行访问。 int [4]class CA不兼容类型。

此规则很重要:优化器可能会将值aa[0]缓存在寄存器中,而在将对象放在同一内存地址时不会重新加载寄存器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM