加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何不指定函数参数的精确评估顺序有助于C&C编译器生成优化

发布时间:2020-12-16 10:55:12 所属栏目:百科 来源:网络整理
导读:#include iostreamint foo() { std::cout"foo() is calledn"; return 9;}int bar() { std::cout"bar() is calledn"; return 18;}int main() { std::coutfoo()' 'bar()' ''n';}// Above program's behaviour is unspecified// clang++ evaluates function
#include <iostream>
int foo() {
    std::cout<<"foo() is calledn";
    return 9;
}
int bar() {
    std::cout<<"bar() is calledn";
    return 18;
}
int main() {
    std::cout<<foo()<<' '<<bar()<<' '<<'n';
}
// Above program's behaviour is unspecified
// clang++ evaluates function arguments from left to right: http://melpon.org/wandbox/permlink/STnvMm1YVrrSRSsB
// g++ & MSVC++ evaluates function arguments from right to left
// so either foo() or bar() can be called first depending upon compiler.

上述程序的输出取决于编译器.未指定评估函数参数的顺序.我读到这个的原因是它可以导致高度优化的代码.如何不指定函数参数的精确评估顺序有助于编译器生成优化代码?

AFAIK,评估顺序严格按Java,C#,D等语言规定.

解决方法

我认为这个问题的整个前提是错误的:

How not specify an exact order of evaluation of function argument helps C & C++ compiler to generate optimized code?

它不是关于优化代码(尽管它确实允许).它不会惩罚编译器,因为底层硬件具有某些ABI约束.

一些系统依赖于按相反顺序推送堆叠的参数,而其他系统依赖于正向顺序. C在所有类型的系统上运行,各种约束条件.如果您在语言级别强制执行订单,则需要一些系统支付罚款才能执行该订单.

C的第一条规则是“如果你不使用它,那么你就不应该付钱”.因此,执行订单将违反C的主要指令.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读