首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在不同版本的gcc上有不同的结果

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

Stack Overflow用户
提问于 2010-10-26 15:35:05
回答 3查看 158关注 0票数 5

按如下方式比较两个代码:

代码语言:javascript
复制
  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

为什么?

EN

回答 3

Stack Overflow用户

发布于 2010-10-26 15:39:22

首先,不同版本的《GCC》标准合规性程度不同。

在这种情况下,以后的版本“更正确”-值初始化必须在第一个代码段中进行(因为您隐式地为具有POD成员变量的类调用了默认的编译器生成的构造函数),这将导致CA类的成员变量初始化为零。参见this very detailed answer by user Michael Burr以及this answer to a closely related question

票数 2
EN

Stack Overflow用户

发布于 2010-10-26 15:39:27

这是新的位置。您在该内存中初始化了一个CA类型的对象,i、j和k的默认值为零,因此aa、aa1和aa2被置零。

票数 1
EN

Stack Overflow用户

发布于 2010-10-26 15:47:23

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

这条规则很重要:优化器可能会将值aa[0]缓存在寄存器中,并且当您将对象放在相同的内存地址时,不会重新加载寄存器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4021567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档