相关疑难解决方法(0)

如何从GCC /铿锵声组件输出中消除"噪音"?

我想检查boost::variant在我的代码中应用的程序集输出,以便查看哪些中间调用被优化掉了.

当我编译以下示例(使用GCC 5.3 g++ -O3 -std=c++14 -S)时,似乎编译器优化了所有内容并直接返回100:

(...)
main:
.LFB9320:
    .cfi_startproc
    movl    $100, %eax
    ret
    .cfi_endproc
(...)
Run Code Online (Sandbox Code Playgroud)
#include <boost/variant.hpp>

struct Foo
{
    int get() { return 100; }
};

struct Bar
{
    int get() { return 999; }
};

using Variant = boost::variant<Foo, Bar>;


int run(Variant v)
{
    return boost::apply_visitor([](auto& x){return x.get();}, v);
}
int main()
{
    Foo f;
    return run(f);
}
Run Code Online (Sandbox Code Playgroud)

但是,完整的程序集输出包含的内容远远超过上面的摘录,对我而言,它看起来永远不会被调用.有没有办法告诉GCC/clang删除所有"噪音"并输出程序运行时实际调用的内容?


完整装配输出:

    .file   "main1.cpp"
    .section    .rodata.str1.8,"aMS",@progbits,1
    .align 8
.LC0:
    .string "/opt/boost/include/boost/variant/detail/forced_return.hpp"
    .section    .rodata.str1.1,"aMS",@progbits,1
.LC1: …
Run Code Online (Sandbox Code Playgroud)

c++ assembly gcc clang

56
推荐指数
3
解决办法
1万
查看次数

编译器是否总是生成汇编代码?

来自C++中的思考 - 第1卷:

在第二遍中,代码生成器遍历解析树并为树的节点生成汇编语言代码机器代码.

至少在GCC中,如果我们给出生成汇编代码的选项,编译器会通过创建包含汇编代码的文件来服从.但是,当我们只是在gcc没有任何选项的情况下运行命令时,它是否在内部不生成汇编代码?

如果是,那么为什么需要首先生成汇编代码然后将其转换为机器语言?

compiler-construction assembly gcc

6
推荐指数
1
解决办法
2604
查看次数

将C++首先转换为汇编

我有困惑.我是C++开发人员,并多次听说我的源代码将首先转换为程序集,然后程序集将转换为机器代码.但是在汇编语言的一个视频教程中,教师清楚地说,C/C++代码直接转换为机器代码.(当然会有链接和加载).

我见过像这样的链接, C++代码是否编译成汇编代码?

我仍然无法澄清我的怀疑.

如果以防万一,C++没有首先转换为汇编,那么反汇编器如何从二进制生成汇编代码.

c++ compiler-construction assembly standards

1
推荐指数
1
解决办法
2028
查看次数

标签 统计

assembly ×3

c++ ×2

compiler-construction ×2

gcc ×2

clang ×1

standards ×1