相关疑难解决方法(0)

你如何在gcc中从C/C++源获得汇编程序输出?

怎么做到这一点?

如果我想分析如何编译某些内容,我将如何获得发出的汇编代码?

c c++ debugging assembly gcc

340
推荐指数
14
解决办法
31万
查看次数

如何查看C++程序的汇编代码?

如何查看C++程序的汇编代码?

有什么流行的工具可以做到这一点?

c++ assembly disassembly

128
推荐指数
9
解决办法
8万
查看次数

临时变量会减慢我的程序吗?

假设我有以下C代码:

int i = 5;
int j = 10;
int result = i + j;
Run Code Online (Sandbox Code Playgroud)

如果我多次循环,使用它会更快int result = 5 + 10吗?我经常创建临时变量以使我的代码更具可读性,例如,如果使用某个长表达式从某个数组中获取这两个变量来计算索引.这在C中是否表现不佳?其他语言怎么样?

c performance temporary

72
推荐指数
5
解决办法
5921
查看次数

如何从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中效率的"静态const"与"#define"

我最近想知道什么之间的区别#define,并static constç为什么两种方法存在做同样的事情.我发现有些人在这里有类似的问题:

很多人谈论最佳实践和约定,并给出使用一个在另一个上的实际原因,例如需要将指针传递给常量,我可以用a static const而不是a #define.但是我还没有找到任何人谈论两者效率的比较.

根据我对C预处理器的理解,如果我有这样的声明:

#define CONSTANT 6
Run Code Online (Sandbox Code Playgroud)

我创建一个可以像这样使用的常量值

char[CONSTANT]char[6]在实际编译之前, 它实际上将被替换为此语句.

这对我来说似乎比使用a更有效, static const constant = 6;因为这将创建一个名为constant的变量,它将存在于堆栈中,我认为它会带来更多的行李而不是a #define.假设我需要一个常量,我可以选择使用预处理器#definestatic const语句,没有明显的理由选择一个而不是另一个,哪个更有效?我将如何自己测试呢?

c performance constants c-preprocessor

21
推荐指数
2
解决办法
2万
查看次数

如何使用GCC将源代码行与汇编输出内联?

我想让C源代码行与汇编输出内联,以查看正在生成的代码.

我尝试过GCC选项-S -Wa,-ahlms(甚至-Wa,--gstabs'因为我在某处读过它).

哦! 顺便说一句,我在Mac上,所以我没有objdump.

(对不起,这很简短,我得下车!)

输出 gcc pc-clisp.c -S -g -fverbose-asm -fnested-functions

.globl _getBool
_getBool:
LFB32:
LM21:
    pushl   %ebp    #
LCFI30:
    movl    %esp, %ebp      #,
LCFI31:
    subl    $8, %esp        #,
LCFI32:
LM22:
    movzbl  8(%ebp), %eax   # atom.pred, D.4112
    movzbl  %al, %eax       # D.4112, D.4113
    andl    $-16, %eax      #, D.4114
    sarl    $4, %eax        #, D.4115
    testl   %eax, %eax      # D.4115
    setne   %al     #, tmp64
    movzbl  %al, %eax       # tmp64, D.4111
    leave
    ret
LFE32:
Run Code Online (Sandbox Code Playgroud)

c macos assembly gcc

14
推荐指数
2
解决办法
6998
查看次数

C++中的汇编代码

我想学习阅读编译器生成的汇编代码.我在哪里以及如何评估从C++生成的汇编代码?

谢谢

c++

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

如何使用g ++对我的循环进行矢量化?

我在搜索时找到的介绍性链接:

  1. 6.59.14循环特定的Pragma
  2. 2.100 Pragma Loop_Optimize
  3. 如何给出关于循环计数的gcc的提示
  4. 告诉gcc专门展开一个循环
  5. 如何在C++中强制进行矢量化

正如你所看到的,大多数是C语言,但我认为它们也适用于C++.这是我的代码:

template<typename T>
//__attribute__((optimize("unroll-loops")))
//__attribute__ ((pure))
void foo(std::vector<T> &p1, size_t start,
            size_t end, const std::vector<T> &p2) {
  typename std::vector<T>::const_iterator it2 = p2.begin();
  //#pragma simd
  //#pragma omp parallel for
  //#pragma GCC ivdep Unroll Vector
  for (size_t i = start; i < end; ++i, ++it2) {
    p1[i] = p1[i] - *it2;
    p1[i] += 1;
  }
}

int main()
{
    size_t n;
    double x,y;
    n = 12800000;
    vector<double> v,u;
    for(size_t i=0; i<n; ++i) {
        x …
Run Code Online (Sandbox Code Playgroud)

c++ optimization g++ vectorization loop-unrolling

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

pow功能在这里发生了什么?

我在这里看到了各种各样的答案,描述了powC 中函数的奇怪行为.
但我在这里有一些不同的问题.

在下面的代码我初始化int x = pow(10,2)int y = pow(10,n) (int n = 2).

在第一种情况下,当我打印它显示的结果时100 ,在另一种情况下它出来了99.

我知道pow返回double它会在存储时被截断int,但我想问为什么输出会有所不同.

CODE1

#include<stdio.h>
#include<math.h>
int main()
{
     int n = 2;
     int x;
     int y;
     x = pow(10,2);   //Printing Gives Output 100   
     y = pow(10,n);   //Printing Gives Output 99


     printf("%d %d" , x , y);

}
Run Code Online (Sandbox Code Playgroud)

Output : 100 99

为什么输出结果不同.?

我的gcc版本是4.9.2

更新:

代码2

int main()
    {
         int …
Run Code Online (Sandbox Code Playgroud)

c gcc compiler-optimization pow gcc4.9

10
推荐指数
2
解决办法
1397
查看次数

在 LTO 模式下从 GCC/Clang 获取汇编输出

通常,可以使用GCC 和 Clang 中的标志从源文件中获取 GCC 的优化汇编器输出-S如下例所示。

gcc -O3 -S -c -o foo.s foo.c
Run Code Online (Sandbox Code Playgroud)

但是假设我编译所有源文件-O3 -flto以启用链接时整个程序优化,并希望查看最终编译器生成的函数优化程序集,和/或查看代码在哪里/如何内联。

编译的结果是一堆.o文件,正如预期的那样,这些文件实际上是伪装成目标文件的 IR 文件。在链接可执行文件或共享库时,它们会被混合在一起,作为一个整体进行优化,然后编译成目标二进制文件。

但是如果我想要这个过程的汇编输出怎么办?也就是说,链接时优化之后、在将 IR 编译为程序集期间以及在实际程序集和链接到最终可执行文件之前产生的程序集源。

我尝试简单地向-S链接步骤添加一个标志,但这并没有真正起作用。

我知道反汇编可执行文件是可能的,甚至与源代码交错,但有时查看实际编译器生成的程序集会更好,尤其是使用-fverbose-asm.

assembly gcc clang lto

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