当编译时已知引用在非聚合结构中采用 space 时,是否错过了优化?
Is it a missed optimization, when a compile-time known reference takes space in a non-aggregate struct?
注意:这是的后续问题,它表明聚合初始化可以代替b
的默认初始化作为对a
的引用,方法是对其他一些变量的引用。这个问题是关于当聚合初始化不可能时会发生什么。
看这个例子:
struct Foo {
int a;
int &b;
Foo() : b(a) { }
};
如果sizeof(Foo)!=sizeof(int)
,是否错过了优化?
我的意思是,编译器能否从结构中删除 b
,因为它始终引用 a
?
有什么可以阻止编译器进行这种转换吗?
(注意,struct Foo
看起来就是这样,没有额外的构造函数等。但是你可以在Foo
周围添加任何东西,这表明这种优化会违反标准)
在下面的例子中y.b
指的是x.a
。
int main ()
{
Foo x;
Foo y(x);
return 0;
}
注意:这是b
的默认初始化作为对a
的引用,方法是对其他一些变量的引用。这个问题是关于当聚合初始化不可能时会发生什么。
看这个例子:
struct Foo {
int a;
int &b;
Foo() : b(a) { }
};
如果sizeof(Foo)!=sizeof(int)
,是否错过了优化?
我的意思是,编译器能否从结构中删除 b
,因为它始终引用 a
?
有什么可以阻止编译器进行这种转换吗?
(注意,struct Foo
看起来就是这样,没有额外的构造函数等。但是你可以在Foo
周围添加任何东西,这表明这种优化会违反标准)
在下面的例子中y.b
指的是x.a
。
int main ()
{
Foo x;
Foo y(x);
return 0;
}