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 time
int fn = fac(n); // evaluated at run time (n is a var iable)
constexpr int f6 = fac(6); // must be evaluated at compile time
constexpr 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 constexpr
char 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 function
for (int i=0; i<a; +=i) sum +=fac(i); // error : loop in constexpr function
return 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);

 

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

 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C++11 引入了 constexpr 关键字,用于指定函数或对象是常量表达式常量表达式是在编译时就能计算出结果的表达式,它可以用于数组大小、模板参数等需要在编译时确定的地方。 constexpr 函数 constexpr 函数是指能在编译时求值的函数,它的返回值可以作为常量表达式使用。constexpr 函数的参数和返回值必须是字面类型。 例如,下面的函数就是一个 constexpr 函数: ```cpp constexpr int square(int x) { return x * x; } ``` 我们可以在编译时计算出 square(5) 的值,因此它是一个常量表达式constexpr 对象 constexpr 对象是指在编译时就能计算出值的对象。constexpr 对象必须被声明为 const,而且必须用常量表达式初始化。 例如,下面的语句定义了一个 constexpr 对象: ```cpp constexpr int max_num = 100; ``` 我们可以在编译时就知道 max_num 的值是 100,因此它是一个常量表达式constexpr 函数常量表达式的限制 constexpr 函数常量表达式有一些限制: 1. constexpr 函数必须有一个返回值,而且返回值必须是字面类型。 2. constexpr 函数函数体必须足够简单,能在编译时被求值。 3. constexpr 函数不能包含任何副作用,比如修改全局变量或调用非 constexpr 函数。 4. constexpr 函数的参数和返回值必须是字面类型。 5. constexpr 对象必须被声明为 const,而且必须用常量表达式初始化。 6. constexpr 对象的类型必须是字面类型。 总结 constexpr 关键字用于指定函数或对象是常量表达式constexpr 函数常量表达式必须在编译时就能计算出值,它们有一些限制。constexpr 函数常量表达式可以用于数组大小、模板参数等需要在编译时确定的地方。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

靖心

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值