首页 > 编程语言 >现代C++(Modern C++)基本用法实践:六、constexpr编译时计算

现代C++(Modern C++)基本用法实践:六、constexpr编译时计算

时间:2023-07-13 13:01:03浏览次数:38  
标签:LOG int Modern C++ constexpr str VAR

概述

constexpr修饰的变量、函数、对象构造函数表示在编译时就可以确定。
它经常用来计算一些编译期可以确定常数,和常数组成的表。比如编译时确定10000以内所有的素数,运行时用的时候直接查表。

用法举例

参考测试项目代码ModernCppTest/modrenc_constexpr.cpp
主要内容:

  • constexpr常量
  • constexpr函数
  • constexpr构造函数/对象
#include "ModernCppTestHeader.h"

namespace n_constexpr {
	constexpr int x1 = 5;
	constexpr int x2 = x1 * 2;


	constexpr int add(int x, int y) {
		return x + y;
	}
	constexpr int sum = add(7, 8);

	constexpr int str_len(const char* str) {
		return *str ? 1 + str_len(str + 1) : 0;
	}
	constexpr int hello_str_len = str_len("hello");

	constexpr int fibo(int n) {
		return (n <= 2) ? 1 : fibo(n - 1) + fibo(n - 2);
	}

	template <int N>
	struct Fibo
	{
		static const int value = fibo(N);
	};


	template<int N>
	struct ConstexprOrderArr {
		int arr[N];
		constexpr ConstexprOrderArr(){
			// C++14 constexpr 可以使用for循环
			for (size_t i = 0; i < N; i++)
			{
				arr[i] = i;
			}
		}
	};

}

void constexpr_test()
{
	LOG_FUNC();


	LOG_TAG("constexpr 常量");
	{
		LOG_VAR(n_constexpr::x1);
		LOG_VAR(n_constexpr::x2);
	}


	LOG_TAG("constexpr 函数");
	{
		LOG_VAR(n_constexpr::sum);
		LOG_VAR(n_constexpr::hello_str_len);
		LOG_VAR(n_constexpr::Fibo<5>::value);
	}


	LOG_TAG("constexpr 构造函数/对象");
	{
		n_constexpr::ConstexprOrderArr<5> a;
		for (auto e : a.arr)
		{
			LOG_VAR(e);
		}
	}
}

标签:LOG,int,Modern,C++,constexpr,str,VAR
From: https://www.cnblogs.com/hggzhang/p/17545410.html

相关文章

  • 现代C++(Modern C++)基本用法实践:零、概述&测试项目
    序言习惯上,我们把C++11之前的C++语法特性称之为“传统C++”,而把c++11之后的语法特性称之为现代C++。有一种说法称C++为中级语言,因为它的特性介于低级语言(如各类汇编语言)和高级语言(Python、C#)之间--一般来说,它在运行效率上比高级语言要高,而在开发效率上又比高级语言低一些。随着C......
  • 现代C++(Modern C++)基本用法实践:N、其他零散的常用特性
    概述这一篇简单介绍一些其他的比较实用的特性,如果读者想了解现代C++的全部特性,参考:cppreference其他特性预置和弃置函数default&delete在C++11中引入了default和delete关键字,允许程序员更加明确地控制类的默认操作(如默认构造函数,拷贝构造函数,拷贝赋值运算符,析构函数等)......
  • 现代C++(Modern C++)基本用法实践:八、线程支持
    概述在c++11之前,c++并未对线程编程提供直接的支持。在c++11之后,支持了线程管理、同步、条件变量等支持。在其他的c++库中(例如UE的线程库)还增加了多任务模型的抽象。用法举例参考测试项目的modrenc_auto_decltype.cpp文件主要内容:线程的创建使用future&async进行异步操作......
  • PAT-甲级-1007 Maximum Subsequence Sum C++
    Givenasequenceof K integers{ N1​, N2​,..., N​K }.Acontinuoussubsequenceisdefinedtobe{ Ni​, Ni+1​,..., Nj​ }where 1≤i≤j≤K.TheMaximumSubsequenceisthecontinuoussubsequencewhichhasthelargestsumofitselements.Fore......
  • c++ day 8
    今天终于来学习时间复杂度了当分析算法的时间复杂度时,我们通常关注以下几个方面来确定算法的执行时间:循环次数:循环是算法中常见的结构,它会重复执行一段代码。时间复杂度取决于循环的次数。例如,一个循环从1到n的遍历,时间复杂度就是O(n)。嵌套循环:如果算法中存在多个嵌套循环......
  • 【C++开源库】Windows 下编译 libcurl 库
    Whatislibcurl?libcurl是一个跨平台的网络协议库,支持http,https,ftp,gopher,telnet,dict,file,和ldap协议。libcurl同样支持HTTPS证书授权,HTTPPOST,HTTPPUT,FTP上传,HTTP基本表单上传,代理,cookies和用户认证。想要知道更多关于libcurl的介绍,可以到官网......
  • C++ 数据封装
     所有的C++程序都有以下两个基本要素:程序语句(代码):这是程序中执行动作的部分,它们被称为函数。程序数据:数据是程序的信息,会受到程序函数的影响。封装是面向对象编程中的把数据和操作数据的函数绑定在一起的一个概念,这样能避免受到外界的干扰和误用,从而确保了安全。数据封装......
  • C++ 接口(抽象类)
     接口描述了类的行为和功能,而不需要完成类的特定实现。C++接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念。如果类中至少有一个函数被声明为纯虚函数,则这个类就是抽象类。https://www.lekaowang.com/cfa/oitt/......
  • C++计算机学院2023年度小学期编程实践课程(图书管理系统)[2023-07-12]
    C++计算机学院2023年度小学期编程实践课程(图书管理系统)[2023-07-12]计算机学院2023年度小学期编程实践课程上机实验题目(一)基于学生结构体数组的图书管理系统(40分)定义学生结构体类型的数组,静态初始化学生信息(不包括借书信息)。图书使用二维字符数组或字符指针数组单独......
  • C++ 傅里叶频谱的计算以及应用
    一维傅里叶频谱的计算#include<stdio.h>#include<math.h>#definepi3.1415926#definerows3#definecolums5typedefstruct{floatre;//reallyfloatim;//imaginary}complex,*pcomplex;complexcomplexadd(complexa,complexb)//复数加......