微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

gcc 将优化打开一个常量变量

如何解决gcc 将优化打开一个常量变量

至于以下纯c代码

typedef enum eFoo_t
{
  FOO_ONE,FOO_TWO
} eFoo;

typedef struct Foo_s
{
  const eFoo x;
  int (*f) (const eFoo x);
  int (*g) (struct Foo_s *y);
} Foo;

int G(Foo *y)
{
  switch (y->x)
  {
    case FOO_ONE:
    return 1;
    case FOO_TWO:
    return 2;
    default:
    break;
  }
  const eFoo z = y->x;
  switch (z)
  {
    case FOO_ONE:
    return 1;
    case FOO_TWO:
    return 2;
    default:
    break;
  }
}

int F(const eFoo x)
{
 switch (x)
  {
    case FOO_ONE:
    return 1;
    case FOO_TWO:
    return 2;
    default:
    break;
  }
}

int main()
{
  const eFoo x = FOO_ONE;
  Foo y = {.x = FOO_TWO,.f = F,.g = G};

  F(x);    // Q1: will the switch be optimized out
  F(y.x);  // Q2: will the switch be optimized out
  y.f(x);  // Q3: will the switch be optimized out
  y.g(&y);   // Q4: will the first and second switch be optimize out
  
  return (F(x) + F(y.x) + y.f(x) + y.g(&y); // 
}

试图找出打开 const 变量是否有好处。 我认为这种优化应该是合理的,并且易于实现。 如注释中所述,gcc -O1 在 https://godbolt.org 中直接返回 6。

解决方法

至于 gcc 是否优化它,我不能说,最好的办法是将其输入到 https://godbolt.org 中查看。

但它可以。它甚至可能不需要是const。如果编译器能够发现它除了那个值之外没有任何其他值,则可以自由地优化它。

标准要求可见行为,而不是底层方法,这就是所谓的“好像”规则。如果实现行为“好像”它遵循标准,它遵循标准,并且可以以它认为合适的任何方式执行:-)

但是,我怀疑在这种情况下不是(至少不在 FG 函数本身内,尽管它可能会内联 main 内的函数行为并在那里对其进行优化) .这是因为它们可以在此翻译单元上从外部调用,这意味着它们不会知道它们将始终以恒定值(const 或不变)被调用。 >

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。