如何解决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
。如果编译器能够发现它除了那个值之外没有任何其他值,则可以自由地优化它。
标准要求可见行为,而不是底层方法,这就是所谓的“好像”规则。如果实现行为“好像”它遵循标准,它遵循标准,并且可以以它认为合适的任何方式执行:-)
但是,我怀疑在这种情况下不是(至少不在 F
和 G
函数本身内,尽管它可能会内联 main
内的函数行为并在那里对其进行优化) .这是因为它们可以在此翻译单元上从外部调用,这意味着它们不会知道它们将始终以恒定值(const
或不变)被调用。 >
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。