【发布时间】:2020-01-08 16:57:50
【问题描述】:
注意:这是Is it a missed optimization, when a compile-time known reference takes space in a struct? 的后续问题,它表明聚合初始化可以通过将b 的默认初始化替换为对a 的引用,使其成为对其他变量的引用。这个问题是关于当聚合初始化不可能时会发生什么。
看这个例子:
struct Foo {
int a;
int &b;
Foo() : b(a) { }
};
如果sizeof(Foo)!=sizeof(int),是不是错过了优化?
我的意思是,编译器可以从结构中删除b,因为它总是引用a?
有什么东西可以阻止编译器进行这种转换吗?
(注意,struct Foo 看起来是这样。没有额外的构造函数等。但是你可以在Foo 周围添加任何东西,这表明这种优化会违反标准)
【问题讨论】:
-
复制你的问题有什么意义?
-
@SergeyA:这不是同一个问题。
-
@SergeyA:这个问题是针对非聚合结构的(在这种情况下,有一个显式的构造函数),而之前的问题是关于“普通”聚合结构的。不足以让 C++ 大师说出这种区别的重要性。似乎有区别;聚合结构可以初始化
b以引用其他变量,但只能通过拒绝调用者将b初始化为其他变量的构造函数构造的结构可能是可优化的。 -
好吧,我错过了那部分,当我投票结束时,没有迹象表明这是后续行动。我认为,如果您提前指出差异,那将是有意义的。
-
构造函数,和所有的成员函数一样,可以不合规地定义,但是一旦看到类定义就必须知道类的大小和布局。因此,进行这样的“优化”意味着类的大小和布局可以根据构造函数(任何构造函数)是在其定义内部还是外部定义而改变。那……不理想。
标签: c++ struct reference initialization language-lawyer