首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么GCC和clang在编译c++17时有差异?

为什么GCC和clang在编译c++17时有差异?
EN

Stack Overflow用户
提问于 2017-07-30 09:44:31
回答 1查看 250关注 0票数 3

这是在GCC 7.1和clang 4.0上复制的,也是在2017年7月30日的两张快照上复制的。

示例1:调用lambdas时,这两个编译器的行为都不同。

代码语言:javascript
复制
int main()
{
    auto sum = [](auto ... a) { return (... + a); };

    auto value1{sum(5,5)};   // Having optimization disabled -O0,
                             // GCC treats this line as if constexpr is there,
                             // clang doesn't.

    constexpr auto value2{sum(1,2,3,4)};  // Both treat this line as constexpr like expected.

                            // As a result, in GCC, no trace of lambdas in the executable,
                            // and only one lambda in clang.

    return value1 + value2;
}

活着 @godbolt

示例2和3:在return语句中调用lambdas,这两个编译器的行为方式相同:运行时评估/无constexpr。

代码语言:javascript
复制
int main()
{
    auto sum = [](auto ... a) { return (... + a); };

    return sum(5,5) + sum(1,2,3,4);   // Both compilers generate 2 lambdas like expected.

}

活着 @godbolt

代码语言:javascript
复制
int main()
{
    constexpr auto sum = [](auto ... a) { return (... + a); };

    return sum(5,5) + sum(1,2,3,4);   // Both compilers generate 2 lambdas like expected.

}

活着 @godbolt

标准主体允许在编译器之间发生这种情况吗?为什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-30 10:07:32

调用lambdas时,这两个编译器的行为都不同。

它们可能输出不同的程序集,但它们具有完全相同的行为。这是标准的保证,没有别的了。因此,在这方面,两者都是正确的,因为它们都返回20

如果可能的话,不必在编译时计算constexpr表达式。没有什么可以禁止调用add的实现,而不是在下面的示例中对其进行优化:

代码语言:javascript
复制
constexpr int add(int lhs, int rhs) {
    return lhs + rhs;
}

int main() {
    return add(4, 5);
}

他们可以,但这并不意味着他们必须。标准试图在编译时给予实现尽可能多的自由,例如允许进行大量的优化,这在一定程度上是为什么未定义的行为和不正确的事物;不需要诊断(如果我错了就纠正我)。

请注意,使用-O3进行编译会导致两个编译器在三个示例中返回20,因此没有区别。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45398459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档