【问题标题】:gcc app runs irregularly but clang works finegcc 应用程序运行不正常,但 clang 工作正常
【发布时间】:2020-11-01 22:13:59
【问题描述】:

我写了一个简单的基于堆栈的虚拟机,你可以在https://github.com/radinParsaei/VM查看它的源代码 当我用 clang 编译它时它工作得很好,但是如果它在字节码中使用 GCC 编译,我已经像 pop() / pop() 这样编码它工作不规则并且它返回 stack[stack.size() - 2] / stack[stack.size() - 1] 我通过编写像 Value a = pop(); Value b = pop(); return a / b; 这样的代码来解决这个问题有人有更好的主意吗?

【问题讨论】:

  • 您的问题可能源于order of evaluation 未指定operator /
  • @IlCapitano 我敢打赌你是对的,应该从你的评论中做出回答。
  • @IlCapitano 我在你的评论中找不到我的答案我已经达到了这个结果:g++ c.cpp ./a.out b() a() 5 clang++ c.cpp ./a。 out b() a() 5 cat c.cpp #include int a() { std::cout

标签: c++ gcc g++ stack-based


【解决方案1】:

正如@IlCapitano 所说,您的第二个pop() 可能会被首先调用:

C++ 中没有从左到右或从右到左求值的概念。不要与运算符的从左到右和从右到左的结合性混淆:表达式 a() + b() + c() 被解析为 (a() + b()) + c( ) 由于 operator+ 的从左到右的关联性,但对 c 的函数调用可以在运行时首先、最后或在 a() 或 b() 之间进行评估

关键: 对 c 的函数调用可以在运行时首先、最后或在 a() 或 b() 之间进行评估

回应评论:

未指定评估顺序(有一些例外)。编译器可以按任意顺序计算操作数和其他子表达式,并且在再次计算同一表达式时可以选择其他顺序。

所以这取决于编译器。每个人的做法都不一样。

【讨论】:

  • 好吧,但是为什么clang的输出和gcc不一样呢?有编译相同的编程语言
  • @radinParsaei GCC 和 clang 允许不同。他们中的一个人一定找到了使用不同订单的充分理由。可能与寄存器分配或堆栈槽排序有关。
猜你喜欢
  • 2018-11-02
  • 2018-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
  • 2014-10-04
相关资源
最近更新 更多