constexpr和consteval --- C++ 20

constexprconsteval — C++ 20

标准库容器和算法库对constexpr 的应用

C++20 中大量的算法和容器可以使用constexpr,这意味着你甚至可以再编译期vector<int>进行排序

Algorithms library - cppreference.com

如下:

#include <iostream>
#include <ranges>
#include <vector>
#include <unordered_set>
#include <algorithm>
#include <format>constexpr int maxElement()
{std::vector myVec{1, 4, 5, 7, 23, 4};std::sort(myVec.begin(), myVec.end());return myVec.back();
}int main(int argc, char* argv[])
{constexpr int maxValue1 = []()-> int{std::vector myVec = {1, 2, 4, 3}; std::sort(myVec.begin(), myVec.end());return myVec.back();}(); //  immediately-invoked lambdastd::cout << maxValue1 << std::endl;constexpr int maxValue = maxElement();std::cout << std::format("maxElement: {}", maxValue);
}

image-20220601215824311

  • immediately-invoked lambda : 即调用函数表达式:先创建Lambda表达式,并不分配给任何闭包对象,然后它被( )调用

Transient Allocation (瞬时分配内存)

Transient Allocation: 编译期申请的内存也会在编译期释放

C++不支持 non-transient constexpr allocation:编译期申请的内存提升为静态在运行时继续使用

#include <iostream>
#include <ranges>
#include <vector>
#include <unordered_set>
#include <algorithm>
#include <format>
#include <memory>#include <memory>constexpr auto correctRelease() {auto* p = new int[2020];delete[] p;return 2020;
}constexpr auto forgottenRelease() { // (1)auto* p = new int[2020];return 2020;
}constexpr auto falseRelease() {     // (3)auto* p = new int[2020];delete p;                       // (2)return 2020;
}int main() {constexpr int res1 = correctRelease();// constexpr int res2 = forgottenRelease();// constexpr int res3 = falseRelease();}

注释掉的函数编译失败,因为内存没有成对的申请和释放

constexpr有个缺点:无法确定是在编译期还是运行时执行

#include <iostream>
#include <ranges>
#include <vector>
#include <unordered_set>
#include <algorithm>
#include <format>
#include <memory>#include <memory>constexpr int constexprFunction(int arg)
{return arg * arg;
}int main()
{static_assert(constexprFunction(10) == 100); // (1)int arrayNewWithConstExpressiomFunction[constexprFunction(100)]; // (2)constexpr int prod = constexprFunction(100); // (3)int a = 100;int runTime = constexprFunction(a); // (4)int runTimeOrCompiletime = constexprFunction(100); // (5) 编译期和运行时都可以执行
}

所以C++20 就有了 consteval,一定在编译期执行

consteval

只能在编译期执行

consteval int sqr(int n) {return n * n;
}
  • 每次调用即时函数都会创建一个编译期常量

  • 不能应用于析构函数,或者申请或释放内存的函数

  • 满足constexpr的所有要求

consteval int sqr(int n) {return n * n;
}
  • 每次调用即时函数都会创建一个编译期常量

  • 不能应用于析构函数,或者申请或释放内存的函数

  • 满足constexpr的所有要求

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/407964.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

函数模板(参考《C++ Templates 英文版第二版》)

函数编程(参考《C Templates 英文版第二版》) Chapter 1 函数模板 1.1 一窥函数模板 template<class T> T max(T a, T b) {return b < a ? a : b; }#include "max1.hpp" #include <iostream> #include <string> #include <format>int…

Curiously Recurring Template Pattern奇怪的模板递归 --- C++20

Curiously Recurring Template Pattern 奇怪的模板递归 — C20 我们都知道C有静态多态和动态多态,动态多态通过虚函数表实现,他的缺点就是对效率产生一点点影响 可以用CRTP解决这个问题 我们先举一个动态多态的例子: #include <iostream> using namespace std;class …

PROJECT #0 - C++ PRIMER [CMU 15-445645]笔记

PROJECT #0 - C PRIMER [CMU 15-445/645]笔记 这是数据库领域的一门课程, 由卡内基梅隆大学副教授Andy Pavlo授课, 目前在网上有授课视频资料、实验以及配套的在线测评环境 (限时开放至2021年12月31日) 环境: wsl2 Clion Project #0 - C Primer 还是很简单的,主要目的是让…

简单JS实现对表的行的增删

这段代码非常的简单&#xff0c;仅仅作为自己的一个小小的记录&#xff01; ok&#xff0c;先上一个简单的图例&#xff0c;效果如下&#xff08;注意&#xff1a;这只是一个简单的例子&#xff0c;不过可以根据这个简单的例子&#xff0c;变化出更为复杂的效果&#xff09;&am…

Yii权限管理工具Srbac使用小结

一、关于Srbac Srbac是基于Yii 框架的 RBAC&#xff08;基于角色的访问控制&#xff09; 插件模块&#xff0c;用于帮助Yii开发人员更方便地进行权限控制&#xff0c;在实际应用过程中也比较方便。 二、安装配置Srbac 在Yii的官方网站的Extensions中已经收录了Srbac插件&#x…

概念concept和requires ---C++ 20

概念concept和requires —C 20 concept concept简化了模板编程的难度 我们可以使用**concept定义模板形参的约束条件T** 模板实力替换T后必须满足std::is_integral_v<C>;为true 例子: requires关键字可以直接约束模板形参T 如下: template <class C> concept …

向DataGridView中添加新的一行数据,可以添加到最后一行或作为第一行

我的开发环境&#xff1a;Microsoft Visual Studio .net 2005 这个程序是Windows Forms Application 新建一个Windows Forms Application项目&#xff0c;打开Form1&#xff0c;在窗体上放一个DataGridView控件和Button,在DataGridView的Columns中添加两列&#xff0c;Name分别…

DataGridView添加一行数据、全选、取消全选、清空数据、删除选中行

.net 2005下的Windows Form Application,一个DataGridView控件和4个Button&#xff0c;界面设置如下&#xff1a; 代码如下&#xff0c;有注解&#xff0c;相信大家都看得明白&#xff1a; using System;using System.Collections.Generic;using System.ComponentModel;using S…

类型萃取类型检查 Type-Traits LibraryType Checks --- C++20

类型萃取:类型检查 Type-Traits Library:Type Checks — C20 Type-Traits library 在C11的时候就已经发布,但依然随着C版本在不断更新 类型检查 Type Checks 每种类型就是十四种主要类型之一 主要类型 template <class T> struct is_void; template <class T>…

模板元编程 Template Metaprogramming--- C++ 20

模板元编程(一) Template Metaprogramming— C 20 在编译期进行类型操作 举个例子: std::move在概念上应该这样实现(实际并不是这么做的): static_cast<std::remove_reference<decltype(arg)>::type&&>(arg);意义上,std::move首先获取它的参数arg,推断…

模板元编程(二) Template Metaprogramming ---C++ 20

模板元编程(二) Template Metaprogramming —C 20 现在我们介绍参数与模板参数混合使用 先看一下例子: #include <iostream>int power(int m, int n) {int r 1;for (int k 1; k < n; k) r * m;return r; }template <int m, int n> struct Power {static in…