gpt4 book ai didi

c++ - 汇编中的内联 C++ 方法

转载 作者:太空宇宙 更新时间:2023-11-04 14:59:54 25 4
gpt4 key购买 nike

让我们创建一个名为myClass 的小类。我感兴趣的是,当方法是否被内联 时,.asm 中的区别是什么。我在 cpp 文件中制作了两个程序,withwithout inline 关键字,但 .asm 输出是相同的。我知道 inline 只是编译器的一个提示,我很可能是优化的受害者,但是是否有可能在一个小的 cpp 示例中看到内联和非内联的区别asm 中的方法?

:

#ifndef CLASS_H
#define CLASS_H

class myClass{
private:
int a;
public:
int getA() const;
};

#endif

cpp:

#include <class.h>
inline int myCLass::getA() const{
return a;
};

主要内容:

#include "class.h"

int main(){
myClass a;
a.getA();
return 0;
}

海湾合作委员会:

gcc -S -O0 main.cpp

两种情况下的 asm 输出:

    .section    __TEXT,__text,regular,pure_instructions
.build_version macos, 10, 14
.globl _main ## -- Begin function main
.p2align 4, 0x90
_main: ## @main
.cfi_startproc
## %bb.0:
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset %rbp, -16
movq %rsp, %rbp
.cfi_def_cfa_register %rbp
subq $16, %rsp
leaq -8(%rbp), %rdi
movl $0, -4(%rbp)
callq __ZNK7myClass4getAEv
xorl %ecx, %ecx
movl %eax, -12(%rbp) ## 4-byte Spill
movl %ecx, %eax
addq $16, %rsp
popq %rbp
retq
.cfi_endproc
## -- End function

.subsections_via_symbols

最佳答案

您没有给编译器内联 myClass::getA() 的机会(如另一个答案中所述)。要比较内联和外联方法,请比较下面代码中 getA()getAlt() 的用法

// file.h    
class myClass
{
int a=1;
public:
int getA() const { return a; } // implicitly inline
int getAlt() const;
};

// file.cc
#include "file.h"
int myClass::getAlt() const
{ return a; }

// main.cc
#include "file.h"
int main()
{
myClass x;
return x.getA() - x.getAlt();
}

除了过程间优化(ipo;因为这可能允许编译器甚至内联 myClass::getAlt())之外,您可以使用完全优化。

关于c++ - 汇编中的内联 C++ 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54082310/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com