确定c ++方法的大小

Determining size of c++ method

我有一个 .cpp 文件,其中定义了各种方法:

// test.cpp

// foo() is not inlined
void foo() {
  ...
}

我编译它:

g++ test.cpp -o test.o -S

现在我想通过检查 test.o 来确定指令 foo() 占用了多少字节的内存。我该怎么做?

我问是因为通过仔细的分析和实验,我确定我正在招致指令缓存未命中,导致某些关键路径上的速度显着下降。因此,我想了解各种方法占用了多少字节,以指导我缩小指令集大小的努力。

我不会为此推荐 -S 标志,除非您喜欢 ISA 的手动和手动计算指令大小。取而代之的是,只需构建和反汇编,答案就出来了:

$ cc -c example.c 
$ objdump -d example.o 

example.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <f>:
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   89 7d fc                mov    %edi,-0x4(%rbp)
   7:   8b 45 fc                mov    -0x4(%rbp),%eax
   a:   83 c0 03                add    [=10=]x3,%eax
   d:   5d                      pop    %rbp
   e:   c3                      retq   

如您所见,这个函数有 15 个字节长。

使用地图文件生成构建,解析地图文件。最后可能会有一些填充,但它会给你一个想法。

在 g++ 中,选项为:

-Xlinker -Map=MyProject.txt