IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 只要能使用constexpr就尽量使用它(C++11/14)—————C++2.0第九讲 -> 正文阅读

[C++知识库]只要能使用constexpr就尽量使用它(C++11/14)—————C++2.0第九讲

0 结论

  • constexpr对象都具备const属性,并由编译期已知的值完成;
  • constexpr函数在调用时若传入的实参值是由编译期已知的,则会产出编译期结果;
  • 比起非constexpr对象或constexpr函数而言,constexpr对象或是constexpr函数可以用在一个作用域更广的语境中。

1 优势

constexpr是在翻译时期(编译、链接时期)就已知。在编译时期就已知的值,拥有许多特权。

  • 比如,可能被放到只读内存中(对于嵌入式工程师很有用);
  • 在编译阶段就已知的常量整形值可以用在C++要求整形常量表达式的语境中,这些语境包括数据的尺寸规格、整形模版实参(包括std::array类型对象的长度)、枚举变量的值、对齐规格等;
  • 在调用constexpr函数时,若传入的值有一个或多个在编译期未知,则它的运作方式和普通函数无异(在运行期间执行结果计算);如果用在编译期间常量语境,任何一个实参值在编译期未知,则代码无法通过编译【这意味着constexpr可以用在要求编译期常量和所有其他值的情况
  • 运行期完成的工作迁到编译期越多,软件运行的越快。

2 注意点

所有constexpr都是const对象,而非所有的const对象都是constexpr对象。

    int x;
    // constexpr auto arraySize = x; //error: constexpr variable 'arraySize' must be initialized by a constant expression
    constexpr auto arraySize = 10; //ok
    std::array<int, arraySize> data; //ok

    const auto arraySize2 = x;
    // std::array<int, arraySize2> data2; // error: non-type template argument is not a constant expression

C++11中限制:

  • 仅限于传入和返回字面型别【在编译期就可以决议的值】,所有内建类型,除了void都符合这个条件;
  • constexpr函数不得包含大于一个可执行的语句;
  • 成员函数不能修改非mutable数据成员。

这些限制在C++14中都被移除了。

class Point{
public:
    constexpr Point(){}
    constexpr Point(double xVal, double yVal) noexcept:m_x(xVal), m_y(yVal){}
    constexpr double xValue() const noexcept{return m_x;}
    constexpr double yValue() const noexcept{return m_y;}
    constexpr void setX(double  newX) noexcept{m_x = newX;} //void 返回
    constexpr void setY(double  newY) noexcept{m_y = newY;} //void 返回
private:
    double m_x, m_y;
};

constexpr Point reflection(const Point& p) noexcept{
    Point result;
    result.setX(-p.xValue());
    result.setY(-p.yValue());
    return  result;
}


int main(){
    constexpr Point p(9.2, 27.7);
    constexpr auto reflect = reflection(p);
    return 0;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-27 16:01:53  更:2021-07-27 16:02:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/2 4:38:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码