【问题标题】:Is it a missed optimization, when a compile-time known reference takes space in a non-aggregate struct?当编译时已知引用在非聚合结构中占用空间时,是否错过了优化?
【发布时间】: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


【解决方案1】:

在以下示例中,y.b 指的是x.a

int main ()
{
    Foo     x;
    Foo     y(x);

    return 0;
}

【讨论】:

  • 好吧,现在我们需要一个后续问题,如果我们阻止生成复制/移动/赋值运算符(或明确实施它们以防止出现问题)会发生什么。 :-)
  • 那么我需要问第三个问题,但我想我会留给其他人/以后...
  • @ShadowRanger:完全正确! :)
  • @geza,我也会扩展我的答案以涵盖这种情况:-)
  • @geza 也许,你应该停止问错误的问题。只需问“在什么情况下优化 […] 是可能的?”然后,您不需要为每个场景都打开一个新问题,只是为了发现它是不可能的。跨度>
猜你喜欢
  • 2020-01-08
  • 1970-01-01
  • 2017-02-06
  • 1970-01-01
  • 2014-04-18
  • 1970-01-01
  • 2014-08-10
  • 2012-05-30
  • 2013-08-06
相关资源
最近更新 更多