相关疑难解决方法(0)

什么时候应该在C++ 11中使用constexpr功能?

在我看来,拥有"总是返回5的功能"正在破坏或淡化"调用函数"的含义.必须有一个原因,或者需要这种能力,或者它不会出现在C++ 11中.为什么会这样?

// preprocessor.
#define MEANING_OF_LIFE 42

// constants:
const int MeaningOfLife = 42;

// constexpr-function:
constexpr int MeaningOfLife () { return 42; }
Run Code Online (Sandbox Code Playgroud)

在我看来,如果我编写了一个返回字面值的函数,并且我进行了代码审查,有人会告诉我,我应该声明一个常量值而不是写回返5.

c++ constexpr c++11

322
推荐指数
9
解决办法
11万
查看次数

隐含的constexpr?

C++ 11编译器(以及他们)是否注意到一个函数是constexpr并且即使它们未被声明为constexpr也会将它们视为这样?

我正在使用维基百科中的示例向使用constexpr的人展示:

int get_five() {return 5;}

int some_value[get_five() + 7]; // Create an array of 12 integers. Ill-formed C++
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是编译器没问题.所以,我进一步更改了get_five()以获取一些int参数,将它们相乘并返回结果,同时仍未明确声明为constexpr.编译器也可以.似乎如果编译器可以做到这一点,那么为了明确声明constexpr的某些东西,没有太多的意义.

c++ constexpr c++11

7
推荐指数
1
解决办法
678
查看次数

我没有观察到constexpr有意义的优化优势

谢谢,我不需要任何书来教我什么constexpr意思.我正在教学constexpr,我的简单例子无法说服学生为什么应该利用编译时计算的优势constexpr.

还请严格避免链接到问题,比如这个它没有汇编代码或分析,他们是没有意义的,我的问题.


我正在寻找一个例子来说明为什么constexpr它有用并且不能被解雇.

好吧,在很多情况下如果constexpr被替换为const没有错,确实会发生.所以,我设计了以下示例:

main_const.cpp

#include <iostream>
using namespace std;

const int factorial(int N)
{
    if(N<=1)
        return 1;
    else 
        return N*factorial(N-1);
}

int main()
{
    cout<<factorial(10)<<endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

main_constexpr.cpp

#include <iostream>
using namespace std;

constexpr int factorial(int N)
{
    if(N<=1)
        return 1;
    else 
        return N*factorial(N-1);
}

int main()
{
    cout<<factorial(10)<<endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但问题是,对于他们以前的那个,汇编代码是

main_const.asm

12:main_last.cpp **** int main()
13:main_last.cpp **** {
132                     .loc …
Run Code Online (Sandbox Code Playgroud)

c++ constexpr c++11

-6
推荐指数
1
解决办法
660
查看次数

标签 统计

c++ ×3

c++11 ×3

constexpr ×3