问题标签 [compiler-explorer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
81 浏览

c++ - 为什么在 consteval 函数中使用的 std::reverse 确实编译虽然不是 constexpr

在 CompilerExplorer 上使用这个小代码片段和 std=c++20 for x86-64 clang 11.0.0 编译并运行。

但是在具有相同设置的 CompilerExplorer 上的 clang-tidy 会产生

整洁的产量是我所期望的。为什么clang处理它的方式不同?

0 投票
1 回答
70 浏览

c++ - 在 Compiler Explorer 上比较函数和函数模板之间的输出

我实现了阶乘函数的简单版本,两者都可以在这里看到。我正在使用 GCC 中继。有2个源文件,第一个是函数版本,第二个是模板版本。每个源文件都有 2 个附加的编译器和一个相关的输出。每个源文件的两个附加编译器之间的唯一区别是左侧编译器没有打开编译器标志或优化,而右侧版本已-O3设置为打开 3 级优化。

这是我的功能:

现在,当我IDE Visual Studio 2017使用 安装在本地 PC 上运行这些时c++17,我得到了从 返回的预期输出main(),并且返回的值对于两种实现都是正确的。

我将此移植到 Compiler Explorer 以测试其他编译器及其优化,以比较它们生成的汇编指令。这是一个相当简单的过程。

现在,当我这样运行这些函数时:

来源#1

来源#2

编译器资源管理器生成以下指令计数...

一切都很好。

所有四个程序执行都返回一个值208

现在我的问题:

但是,在第一个和第三个编译器的程序集中直接在没有进行一些寄存器数学运算的情况下并不明显,但是在第二个和最后一个编译器中,对于和版本-O3都打开了,该值在' 的返回调用之前被存储到寄存器中。为什么编译器资源管理器显示:而不是?functiontemplate720EAXmain()Program returned: 208720

0 投票
1 回答
195 浏览

c++ - 编译器资源管理器上 MSVC 中的范围::子范围

下面的代码在 GCC 8.3Clang 10.0.1上编译和运行得很好,而在 MicroSoft 闪亮的编译器上却惨遭失败。

有没有我丢失的标志?

0 投票
1 回答
2548 浏览

c++ - Godbolt 不显示标准输出

我正在使用https://godbolt.org/来编译一个简单的 C++ 脚本,但即使是最简单的

当我单击时,Add new... --> Compiler --> Output我得到:Compiler returned: 0

0 投票
1 回答
454 浏览

c++ - C、C++ 和 D (dlang) 的编译器资源管理器程序集输出

在使用 Compiler Explorer ( https://godbolt.org/ ) 比较简单程序的汇编输出时,为什么 D 语言的汇编输出与 C 或 C++ 输出相比如此之长。简单的 square 函数输出对于 C、C++ 和 D 是相同的,但 D 输出有额外的行,当将鼠标悬停在源代码中的 square 函数上时,这些行不会突出显示。

  • 这些额外的行是什么?
  • 如何从生成中删除这些行?

假设我在 C++ 和 D 中都有https://godbolt.org/z/64EsWo5Ke模板函数,D 的 Intel asm 输出为 29309 行,而 C++ Intel asm 输出仅为 73 行。

0 投票
0 回答
38 浏览

c++ - 编译器资源管理器允许多个编辑器。一个编辑器的内容可以#included 到另一个编辑器中吗?

Godbolt 的 Compiler Explorer 允许创建其他编辑器。一个编辑器的正文可以#included 到另一个编辑器中吗?类似的东西?https://godbolt.org/z/vvzE9jrzq

显然这不起作用,但是有没有办法让它起作用?鉴于创建其他编辑器的便利性,这似乎应该是一个功能。

0 投票
2 回答
503 浏览

c - 在编译器资源管理器中包含 C 的外部头文件

我想在 Compiler Explorer (godbolt.org) 上运行一个 C 项目,其中包含一些外部头文件。在其中包含这些第三方头文件的程序是什么?

项目截图

假设我想运行这个包含 snipmath.h 文件的代码。此外,snipmath.h 头文件还包括其他 lib 文件。我怎样才能将所有这些都包含在 Godbolt 中?就像我们通常在离线编译器中所做的那样。

0 投票
0 回答
90 浏览

c++ - 比较 C++17 编译器及其生成的优化程序集

这是一个基本的工作 C++ 程序。

它的输出非常明显


代码没有问题,它只是一个测试样本。然而,我很好奇一些主要的不同编译器如何以不同的方式处理这段代码,以更好地了解它们的内部工作原理以及每个编译器的优缺点。

我使用 Compiler Explorer 对此进行了测试,只是为了查看生成的程序集的差异。我正在c++17通过O2优化性能速度而不是O1代码大小来编译每个。


这是从 Clang(trunk) 生成的程序集,编译器标志设置为:-std=C++17 -O2

Clang 正在生成 147 条装配线。


这是 GCC(trunk) 生成的程序集,编译器选项设置为:-std=c++17 -O2

这会产生 95 行汇编指令。


最后,我们将编译器选项设置为 MSVC-x64 msvc v19.latest,/std:c++17 /O2不用说它太大了,无法直接在此处发布,所以这里是 MSVC 选项编译器资源管理器的链接......这令人惊讶地产生了 1600 多一点代码行。


从 GCC 到 Clang 从大约 95 到 150 行指令跳转是一回事,但跳转到超过 1500 行以上是另一回事。是什么赋予了?这是编译器本身之间生成的汇编指令的主要区别以及 MSVC 如何实现其 C++17 语言版本,还是与编译器资源管理器如何与它们如何实现每个编译器有关?为什么指令会有如此戏剧性的跳跃?

0 投票
1 回答
42 浏览

assembly - gcc 用于 MIPS 64 的默认代码模型的名称是什么?

MIPS 64 的 gcc 使用复杂的方法来定位和调用编译单元中不存在的函数。这个代码模型的名称是什么(以及它在哪里记录)?我搜索但没有发现它即将发布。它涉及$28/$gp$25/$t9作为某种参数传递给被调用函数。

而且,这个翻译中是否存在错误(在代码生成或文本输出中)?

以下代码序列:

生成此输出:

在我上面的第二个 <-- 标记处,我希望看到一个间接函数调用,但所有的只有一个nop(这可能是用于调用指令的延迟槽,否则无法解释)。

(在我的第一个标记处,它的来源是 25 美元,因此它必须是提供给的某种参数ff似乎也设置了 25 美元g。)


https://godbolt.org/z/11n9nxs63

添加-msym32到上述命令行选项(告诉它假设所有符号都有一个 32 位地址),代码使用直接函数调用 via jal

0 投票
1 回答
68 浏览

c++ - 如何使用在 GCC 后备箱中?

https://github.com/gcc-mirror/gcc/commit/3acb929cc0beb79e6f4005eb22ee88b45e1cbc1d提交,C++ 标准标头<stacktrace>存在诸如std::stacktrace_entry但未声明之类的东西,因为_GLIBCXX_HAVE_STACKTRACE两者都没有定义。

我已经在https://godbolt.org/z/b9TvEMYnh上尝试过,但是一旦我添加了参数,就会发出链接器错误-lstd++_libbacktrace(ofc,它没有找到)

从提交描述中看这条消息是什么意思?:

目前,仅当使用 --enable-libstdcxx-backtrace=yes 时才会构建新库。