【发布时间】:2017-07-14 17:09:32
【问题描述】:
类似这样的:
static void MyFunction(int x, int y) {};
Clang 会在调用时优化它们吗?
【问题讨论】:
-
为什么不写一个简单的例子自己去看看呢?这是最好的学习方式。 ;-)
标签: function optimization clang compiler-optimization
类似这样的:
static void MyFunction(int x, int y) {};
Clang 会在调用时优化它们吗?
【问题讨论】:
标签: function optimization clang compiler-optimization
这取决于优化级别。如果您没有优化,那么you'll probably still end up with a function。但是,即使使用 -O you'll see it disappear。如果您的函数没有标记为static,它会有点复杂,因为该函数需要存在于其他翻译单元,所以您可能会see an empty body,并且对它的调用在同一个TU中省略,但函数本身必须仍然存在。
【讨论】:
当然,只要定义对调用站点的编译器可见。既然你已经声明了它static,那可能永远都是真的。
【讨论】:
当然是 -O3(实际上是任何!= 0)
【讨论】:
给定代码:
/* Optmizing empty functions */
static void myFunc(int x, int y);
int main(void)
{
int x=1, y=2;
myFunc(x, y);
return 0;
}
static void myFunc(int x, int y)
{
;
}
每个优化级别生成的程序集如下所示:
gcc emptyfunc.c -g -O0 -o emptyfunc.x
Dump of assembler code for function main:
0x0000000000000660 <+0>: push %rbp
0x0000000000000661 <+1>: mov %rsp,%rbp
0x0000000000000664 <+4>: sub $0x10,%rsp
0x0000000000000668 <+8>: movl $0x1,-0x4(%rbp)
0x000000000000066f <+15>: movl $0x2,-0x8(%rbp)
0x0000000000000676 <+22>: mov -0x8(%rbp),%edx
0x0000000000000679 <+25>: mov -0x4(%rbp),%eax
0x000000000000067c <+28>: mov %edx,%esi
0x000000000000067e <+30>: mov %eax,%edi
0x0000000000000680 <+32>: callq 0x68c <myFunc>
0x0000000000000685 <+37>: mov $0x0,%eax
0x000000000000068a <+42>: leaveq
0x000000000000068b <+43>: retq
End of assembler dump.
gcc emptyfunc.c -O1 -o emptyfunc-gccO1.x
Dump of assembler code for function main:
0x0000000000000660 <+0>: mov $0x0,%eax
0x0000000000000665 <+5>: retq
End of assembler dump.
gcc emptyfunc.c -Ofast -o emptyfunc-gccOfast.x
Dump of assembler code for function main:
0x0000000000000530 <+0>: xor %eax,%eax
0x0000000000000532 <+2>: retq
End of assembler dump.
clang emptyfunc.c -o emptyfunc-clangO0.x -g -O0
Dump of assembler code for function main:
0x00000000004004c0 <+0>: push %rbp
0x00000000004004c1 <+1>: mov %rsp,%rbp
0x00000000004004c4 <+4>: sub $0x10,%rsp
0x00000000004004c8 <+8>: movl $0x0,-0x4(%rbp)
0x00000000004004cf <+15>: movl $0x1,-0x8(%rbp)
0x00000000004004d6 <+22>: movl $0x2,-0xc(%rbp)
0x00000000004004dd <+29>: mov -0x8(%rbp),%edi
0x00000000004004e0 <+32>: mov -0xc(%rbp),%esi
0x00000000004004e3 <+35>: callq 0x4004f0 <myFunc>
0x00000000004004e8 <+40>: xor %eax,%eax
0x00000000004004ea <+42>: add $0x10,%rsp
0x00000000004004ee <+46>: pop %rbp
0x00000000004004ef <+47>: retq
End of assembler dump.
clang emptyfunc.c -o emptyfunc-clangOz.x -Oz
Dump of assembler code for function main:
0x00000000004004c0 <+0>: xor %eax,%eax
0x00000000004004c2 <+2>: retq
End of assembler dump.
如您所见,是的,它当然会删除空函数。
【讨论】:
``` 来标记该块。无论在哪里,它都应该工作。但无论如何,因为它似乎是一个错误,我已经删除了 3 个折痕符号并在所有行中添加了缩进。做起来很痛苦,而不是仅仅打开```粘贴代码并用```关闭