>  기사  >  백엔드 개발  >  C++ 리뷰 핵심 포인트 2 요약 - 기능

C++ 리뷰 핵심 포인트 2 요약 - 기능

黄舟
黄舟원래의
2017-01-16 11:18:331170검색

하나의 인라인 함수

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中文网(www.php.cn)!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.