比较两个代码如下:
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
为什么?
答案 0 :(得分:2)
首先,不同版本的GCC具有不同级别的标准合规性。
在这种情况下,更高版本“更正确” - 值初始化必须在第一个片段中进行(因为您隐式调用具有POD成员变量的类的默认编译器生成的构造函数),这将导致成员变量CA类初始化为零。请见this very detailed answer user Michael Burr以及this answer a closely related question。
答案 1 :(得分:1)
这是新的位置。您将CA类型的对象初始化为该内存,并且i,j和k的默认值为零,因此aa [0],aa [1] amd aa [2]变为零。
答案 2 :(得分:0)
我倾向于认为两者都是正确的。您已覆盖int aa[4]
使用的内存(部分),然后尝试访问该数组。这是不正确的:内存包含CA
对象,必须通过该类型或兼容类型访问。 int [4]
和class CA
不兼容。
此规则很重要:优化器可能会将值aa[0]
缓存在寄存器中,而在将对象放在同一内存地址时不会重新加载寄存器。