确定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
我有一个 .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