如何不指定函数参数的精确评估顺序有助于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等语言规定. 解决方法
我认为这个问题的整个前提是错误的:
它不是关于优化代码(尽管它确实允许).它不会惩罚编译器,因为底层硬件具有某些ABI约束. 一些系统依赖于按相反顺序推送堆叠的参数,而其他系统依赖于正向顺序. C在所有类型的系统上运行,各种约束条件.如果您在语言级别强制执行订单,则需要一些系统支付罚款才能执行该订单. C的第一条规则是“如果你不使用它,那么你就不应该付钱”.因此,执行订单将违反C的主要指令. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |