我在Scott Meyers的Effective C++书中读过:
内联函数时,可以使编译器对函数体执行特定于上下文的优化.对于正常的函数调用,这种优化是不可能的.
现在的问题是:什么是特定于上下文的优化以及为什么需要它?
我使用AdventureWorks2012进行测试.和我的问题:为什么SELECT语句直接性能低于表值函数.我只将SELECT statemnt放入表值函数和完全相反的性能.
CREATE FUNCTION [dbo].[atest1]
(
@iBusinessEntityID INT
)
RETURNS @t TABLE
(
[BusinessEntityID] INT
, [NationalIDNumber] NVARCHAR(15)
, [JobTitle] NVARCHAR(50)
)
AS
BEGIN
INSERT INTO @t
SELECT
[e].[BusinessEntityID]
, [e].[NationalIDNumber]
, [e].[JobTitle]
FROM [HumanResources].[Employee] [e]
INNER JOIN [Person].[Person] [p]
ON [p].[BusinessEntityID] = [e].[BusinessEntityID]
WHERE [e].[BusinessEntityID] = @iBusinessEntityID;
RETURN;
END;
--TEST PERFORMANCE
SELECT
*
FROM [dbo].[atest1](5);
GO
SELECT
[e].[BusinessEntityID]
, [e].[NationalIDNumber]
, [e].[JobTitle]
FROM [HumanResources].[Employee] [e]
INNER JOIN [Person].[Person] [p]
ON [p].[BusinessEntityID] = [e].[BusinessEntityID]
WHERE [e].[BusinessEntityID] = 5;
Run Code Online (Sandbox Code Playgroud) sql-server user-defined-functions inline-functions table-functions
我在我的一个标题中有一些简短的定义,如下所示:
#define ROUND_DOWN(a,b) (a)-(a)%(b)
Run Code Online (Sandbox Code Playgroud)
例如
ROUND_DOWN(178,32) = 160
Run Code Online (Sandbox Code Playgroud)
但是,如果我把它传递给它:
ROUND_DOWN(160*2, 32);
Run Code Online (Sandbox Code Playgroud)
然后它像这样编译?
(160*2)-(160*2)%(32),
Run Code Online (Sandbox Code Playgroud)
这只是处理160*2两次..
我想知道内联函数是否以相同的方式运行?例如
inline int RoundDown(int a, int b)
{
return (a)-(a)%(b)
}
Run Code Online (Sandbox Code Playgroud)
将160*2作为320存储在"int a"中,然后计算会起作用,还是它的行为与定义相同?
一个更好的例子是:
RoundDown((x+x2)*zoom, tile_width);
Run Code Online (Sandbox Code Playgroud) 内联函数和main之间有什么区别,如下所示:
inline double cube(double side)
{
return side * side * side;
}
int main( )
{
cube(5);
}
Run Code Online (Sandbox Code Playgroud)
vs只是定期声明一个函数:
double cube(double side)
{
return side * side * side;
}
int main( )
{
cube(5);
}
Run Code Online (Sandbox Code Playgroud)
vs功能原型?
double cube(double);
int main( )
{
cube(5);
}
double cube(double side)
{
return side * side * side;
}
Run Code Online (Sandbox Code Playgroud) c++ inline-functions function-prototypes function-declaration
声明:"必须在调用内联函数之前定义它们."
这个陈述是否正确?
[编辑]
问题最初是德语:
Inline-Funktionenmüssenvorihrem Aufruf definiert sein.
也许它可以帮助任何人......
是否有充分的理由在MATLAB中使用内联函数与匿名函数之间进行选择?这里已经提出并回答了这个确切的问题,但答案对新手MATLAB用户没有帮助,因为代码片段不完整,所以当粘贴到MATLAB命令窗口时它们不会运行.有人可以提供可以粘贴到MATLAB的代码片段的答案吗?
我读到内联函数,在进行函数调用时,我们用函数定义的主体替换函数调用.
根据以上说明,用户何时不应该有任何函数调用inline.
如果是这种情况为什么我call在汇编代码中看到三条指令?
#include <iostream>
inline int add(int x, int y)
{
return x+ y;
}
int main()
{
add(8,9);
add(20,10);
add(100,233);
}
meow@vikkyhacks ~/Arena/c/temp $ g++ -c a.cpp
meow@vikkyhacks ~/Arena/c/temp $ objdump -M intel -d a.o
0000000000000000 <main>:
0: 55 push rbp
1: 48 89 e5 mov rbp,rsp
4: be 09 00 00 00 mov esi,0x9
9: bf 08 00 00 00 mov edi,0x8
e: e8 00 00 00 00 call 13 <main+0x13>
13: …Run Code Online (Sandbox Code Playgroud) 根据一些书,类中定义的函数(连同标题中的定义)始终是内联的。真的吗?
我们如何使用测试应用程序创建这样的场景?
伙计们,
我正在阅读" 用C++思考"(Chap - Inline函数),在那里我遇到了这个语句.
"如果隐式或明确地采用函数的地址,编译器也无法执行内联".
这是什么意思" taking address of function implicitly or explicitly"?
为什么在这种情况下无法内联?
谢谢.
考虑以下代码:
在 header.h 中
#pragma once
class someClass
{
public:
void foo();
};
Run Code Online (Sandbox Code Playgroud)
在头文件.cpp中
#include "header.h"
inline void someClass::foo(){}
Run Code Online (Sandbox Code Playgroud)
在main.cpp中
#include <iostream>
#include "header.h"
using namespace std;
int main()
{
someClass obj;
obj.foo();
}
Run Code Online (Sandbox Code Playgroud)
这里我得到一个链接错误,因为 foo 函数在 header.cpp 中被定义为内联,如果我删除 'inline' 关键字,编译和运行将继续没有错误。
请告诉我为什么这个“内联”函数出现链接错误?
inline-functions ×10
c++ ×8
assembly ×1
c ×1
inlining ×1
linkage ×1
matlab ×1
optimization ×1
sql-server ×1