![]() |
1
7
我试着用一个相当旧的gcc编译这个-
并且主要编译到这个-
因此,它在编译时编译了加法,得到223。 显然,结果取决于您的代码和编译器,但这表明它可以并且可以在编译时内联和计算加法(如果可以的话)。 |
![]() |
2
4
C++中没有。它们不会像那样在编译时执行——除非编译器神奇地做到了。然而,这是不能强迫的。
但是,使用C++11,您可以使用
因此,您可以将函数重写为:
请注意,如果此函数的参数不总是常量,则不必担心。 来自维基百科:
这意味着
参考文献: http://en.wikipedia.org/wiki/C%2B%2B11#constexpr_-_Generalized_constant_expressions |
![]() |
3
2
如果您在头文件中定义了它,那么它很有可能被内联。如果您使用积分编译时常数作为其参数,那么编译器应该能够在编译时执行该函数。
即使没有这样的保证,你也应该相信你的编译器。他们非常擅长优化您的代码。如果要确保函数在编译时执行,可以添加
我尝试了以下片段:
当使用GCC和-O3标志进行编译时,它被编译为:
因此,您可以看到它实际上是在编译时执行的。 |
![]() |
4
1
是否执行这样的优化不是C和C++语言的定义部分。从本质上讲,只要生成的代码根据源代码有效,编译器就可以自由地进行优化。在一般情况下,在更高的优化级别上,此调用可以是内联的,或者如果调用站点总是传入常量(编译时已知的值),则可以在编译时计算结果,并且完全避免任何运行时开销。 优化编译器选择不内联函数的一般情况如下:
需要注意的另一个问题是,内联将更改函数的链接。
使用在GCC和G++上编译以下C代码
产生以下程序集代码:
|
|
5
0
您可以检查程序集列表以查看它是否内联,但如前所述,它是特定于编译器的。 |
![]() |
6
0
它取决于编译器和优化设置,但通常情况下,当您至少打开一点优化时,您可以假设任何足够高级的编译器都会内联这样一个微不足道的函数。 当您希望确保函数是内联的时,您可以始终使用inline关键字声明它:
但通常应该避免使用这种善意的提示,因为大多数编译器比大多数程序员更善于决定内联哪些函数。 |
|
7
0
如何在编译时计算此函数的可能场景:
注意:在看到程序的汇编代码之前,您永远不会确切知道函数是否是内联的。即使你使用
|
![]() |
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
![]() |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
![]() |
rainer · 后台插入程序的初始化 1 年前 |
![]() |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
|
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
|
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |