하나의 인라인 함수
C++에 인라인 함수가 필요한 이유는 무엇인가요? 인라인 함수란 무엇인가요?
우리는 const int A=3;과 같은 상수에 대해 매크로 정의 대신 const를 사용할 수 있다는 것을 이미 알고 있습니다.
그러므로 함수의 경우 이러한 매크로가 가능합니까? 대체 효과를 얻었습니까?
참조:
#define MYFUNC(a, b) ((a) < (b) ? (a) :(b)) // 宏替换的表示 inline int myfunc(int a, int b) //函数表示 { returna < b ? a : b; }
이것은 인라인 함수입니다. 지침에 유의하세요
참고 1:
은 int myfunc(int a, int b)와 함께 작성된 함수 본문의 구현을 인라인해야 합니다
참고 2
C++ 컴파일러는 함수를 인라인으로 컴파일할 수 있습니다.
C++ 컴파일러로 인라인으로 컴파일된 함수를 인라인 함수라고 합니다
최종 생성 코드에는 인라인 함수가 정의되어 있지 않습니다
C++ 컴파일러는 함수가 호출되는 위치에 함수 본문을 직접 삽입합니다
인라인 함수에는 일반 함수가 없습니다. 호출(푸시, 점프, 리턴) 시 오버헤드 - 존재 값
참고 3: C++ 컴파일러는 함수에 대한 인라인 요청을 반드시 허용하지 않을 수도 있습니다!
설명 4
인라인 함수는 일반 함수의 특성(매개변수 확인, 반환 유형 등)을 갖는 특수 함수입니다.
인라인 함수는 다음을 위한 특수 함수입니다. 컴파일러 A 요청이므로 컴파일러가 이 요청을 거부할 수 있습니다.
인라인 함수는 컴파일러에 의해 처리되고, 컴파일된 함수 본문은 호출 위치에 직접 삽입됩니다.
매크로 코드 조각은 전처리됩니다. 프로세서 , 컴파일 프로세스 없이 간단한 텍스트 교체
참고 5:
최신 C++ 컴파일러는 컴파일 최적화를 수행할 수 있으므로 인라인 선언 없이도 일부 기능도 컴파일될 수 있습니다. 컴파일러에 의한 인라인
또한 일부 최신 C++ 컴파일러는 함수가 인라인되도록 강제할 수 있는 확장 구문을 제공합니다
예: __attribute__((always_inline) in g++ )) 속성
참고 6:
C++의 인라인 컴파일 제한:
에는 어떤 형태의 루프 문도 포함될 수 없습니다.
너무 많은 조건부 판단이 있을 수 없습니다. 명령문
함수 본문이 너무 클 수 없습니다
함수의 주소를 수행할 수 없습니다
함수의 인라인 선언은 호출 명령문 앞에 와야 합니다
인라인 함수에 대한 컴파일러의 제한은 절대적이지 않습니다. 일반 함수에 비해 인라인 함수의 장점은 함수 호출 시 스택을 푸시하고 점프하고 반환하는 오버헤드를 절약할 수 있다는 것입니다.
따라서 함수 본문의 실행 오버헤드가 스택 푸시, 점프 및 반환의 오버헤드보다 훨씬 클 경우 인라인은 의미가 없게 됩니다.
결론:
1) 인라인 함수는 컴파일 시 함수가 호출되는 곳에 함수 본문을 직접 삽입합니다.
2) 인라인은 그냥 요청이 있으면 컴파일러가 이 요청을 반드시 허용하지 않을 수도 있습니다
3) 인라인 함수는 일반 함수 호출 시 스택 푸시, 점프 및 반환의 오버헤드를 절약합니다
두 가지 함수 기본 매개변수
C++에서는 함수 선언 시 매개변수에 대한 기본값을 제공할 수 있습니다(제가 제공하는 값에 따라 전화해주셔야 합니다)
함수 호출 시 , 이 매개변수의 값이 지정되지 않은 경우 컴파일러는
void myPrint(int x = 3) { printf("x:%d", x); }
함수 기본 매개변수에 대한 규칙
매개변수 목록 끝에 있는 매개변수만 자동으로 대체합니다. 기본 매개변수 값 제공
함수 호출에서 기본 매개변수 값을 사용하기 시작하면 이 매개변수 이후의 모든 매개변수는 기본 매개변수 값을 사용해야 합니다
void printAB(int x = 3) { printf("x:%d\n",x); }
기본값에서는 매개변수 규칙, 기본 매개변수가 나타나면 오른쪽에 있는 모든 항목에 기본 매개변수가 있어야 합니다
void printABC(int a, int b, int x = 3, inty=4, int z = 5) { printf("x:%d\n",x); } int main62(int argc, char *argv[]) { printAB(2); printAB(); system("pause"); return0; }
3. 함수 자리 표시자 매개변수(먼저 피트를 가져옴)
자리 표시자 매개변수 매개변수 유형 선언만 있고 매개변수 이름은 없습니다. 명령문
일반적으로 자리 표시자 매개변수는 함수 본문 내에서 사용할 수 없습니다
int func(int a, int b, int ) { returna + b; } int main01() { //func(1, 2); //可以吗?错误 printf("func(1,2, 3) = %d\n", func(1, 2, 3)); getchar(); return0; }
4. )
자리 표시자 매개변수와 기본 매개변수를 결합할 수 있습니다. 의의: 향후 프로그램 확장을 위한 단서를 남겨두십시오. C 언어 프로그램에서 나타날 수 있는 불규칙한 쓰기 방식과 호환
int func2(int a, int b, int = 0) { return a + b; } void main() { //如果默认参数和占位参数在一起,都能调用起来 func2(1,2); func2(1,2, 3); system("pause"); }
结论://如果默认参数和占位参数在一起,都能调用起来
五.函数重载(重点)
1 )函数重载概念
函数重载(FunctionOverload)
用同一个函数名定义不同的函数
当函数名和不同的参数搭配时函数的含义不同
2 )函数重载的判断标准
函数重载至少满足下面的一个条件:
参数个数不同
参数类型不同
参数顺序不同
3 )函数返回值不是函数重载的判断标准
4)编译器调用重载函数的准则
将所有同名函数作为候选者
尝试寻找可行的候选函数
精确匹配实参
通过默认参数能够匹配实参
通过默认类型转换匹配实参
匹配失败
最终寻找到的可行候选函数不唯一,则出现二义性,编译失败。
无法匹配所有候选者,函数未定义,编译失败。
5)函数重载的注意事项
重载函数在本质上是相互独立的不同函数(静态链编)
重载函数的函数类型是不同的
函数返回值不能作为函数重载的依据
函数重载是由函数名和参数列表决定的。
六. 函数重载与函数指针的结合
函数重载与函数指针
当使用重载函数名对函数指针进行赋值时
根据重载规则挑选与函数指针参数列表一致的候选者
严格匹配候选者的函数类型与函数指针的函数类型
//函数指针 基础的语法
//1声明一个函数类型
typedef void (myTypeFunc)(int a,int b) ; //int
//myTypeFunc *myfuncp = NULL; //定义一个函数指针 这个指针指向函数的入口地址
//声明一个函数指针类型
typedef void (*myPTypeFunc)(int a,int b) ; //声明了一个指针的数据类型
//myPTypeFunc fp = NULL; //通过 函数指针类型 定义了 一个函数指针 ,
//定义一个函数指针 变量
void (*myVarPFunc)(int a, int b);
//
待补充!
以上就是C++复习要点总结之二——函数的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!