首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++ inline constexpr 内联函数和常量表达式函数有关问题

2013-10-27 
C++ inline constexpr 内联函数和常量表达式函数问题函数问题一)inline: 内联函数,就是相当于把被调用的函

C++ inline constexpr 内联函数和常量表达式函数问题

函数问题

一)inline: 内联函数,就是相当于把被调用的函数硬嵌入调用它的函数中去,不用保存栈,所以速度快。

1. 要使inline起作用,必须是inline函数定义(不但是声明)在其调用函数范围内

2. 不同头文件包含相同inline函数,不是重定义,但是两个或多个inline函数必须一模一样。

二)constexpr:如果参数是常量,就可以了在编译时计算的函数。

定义一个constexpr函数是为了可以使得函数用于常量表达式中,例如:

constexpr int fac(int n){return (n>1) ? n?fac(n?1) : 1;}constexpr int f9 = fac(9); // must be evaluated at compile time


 

void f(int n){int f5 = fac(5); // may be evaluated at compile timeint fn = fac(n); // evaluated at run time (n is a var iable)constexpr int f6 = fac(6); // must be evaluated at compile timeconstexpr int fnn = fac(n); // error : can’t guarantee compile-time evaluation (n is a var iable)char a[fac(4)]; // OK: array bounds must be constants and fac() is constexprchar a2[fac(n)]; // error : array bounds must be constants and n is a var iable// ...}

constexpr函数有很多限制,constexpr机制也只是用于相对简单的功能的,如下:

int glob;constexpr void bad1(int a) // error : constexpr function cannot be void{glob = a; // error : side effect in constexpr function}constexpr int bad2(int a){if (a>=0) return a; else return ?a; // error : if-statement in constexpr function}constexpr int bad3(int a){sum = 0; // error : local var iable in constexpr functionfor (int i=0; i<a; +=i) sum +=fac(i); // error : loop in constexpr functionreturn sum;}

也如内联函数一样,在不同.h文件中,定义必须相同。可以认为constexpr函数是一个受限制的内联函数。

Constexpr函数不能写操作非局部函数。但是可以读操作非局部函数,可以使用作引用参数,但是也不能作写操作。如:

constexpr int ftbl[] { 1, 2, 3, 5, 8, 13 };constexpr int fib(int n){return (n<sizeof(ftbl)/siz eof(?ftbl)) ? ftbl[n] : fib(n);}


有条件选择句调用constexpr函数是,不选择的分支函数计算是在run-time是发生的。

 

函数返回值问题:
string to_string(int a); //前置返回值 prefix return type
auto to_string(int a) ?> string; //后置返回值suffix return type

两者是一样效果的。

后者主要使用在模板中,如下:
template<class T, class U>
auto product(const vector<T>& x, const vector<U>& y) ?> decltype(x?y);

 

注意不要返回临时变量指针或引用。

 

热点排行