inline 函数 规模小,流程直接且频繁调用 cout<<shortString(s1,s2)<<endl; = cout<<(s1.size()<s2.size()?...s1:s2)<<endl; constexpr函数是指能用于常量表达式的函数。函数的返类型及所有形参的类型都得是字面值类型,而且函数体中必须有一条return语句;
1.变量 const与constexpr可以应用到变量和函数。尽管它们彼此相似,但实际上它们是非常不同的概念。 const与constexpr意味着他们的值不能在初始化后改变。...因此,const变量既可以定义编译时常量(比如size1)来指定数组大小,也可以定义运行时常量(比如size2)来定义数组大小。另一方面,constexpr总是定义可以指定数组大小的编译时常量。...; constexpr 函数当使用在编译期间已知值的参数调用时,constexpr函数产生编译时结果; 与非constexpr对象和函数相比,constexpr对象和函数可以在更广泛的上下文中使用; constexpr...5.补充 内联变量C++17 引入了内联(inline)变量的概念,允许在头文件中定义内联变量,然后像内联函数一样,只要所有的定义都相同,那变量的定义出现多次也没有关系。...内联函数,现在又有了内联变量,以及模板,则不受这条规则限制。
一、constexpr的基本概念与使用1.1 constexpr的定义与作用constexpr是C++11引入的一个关键字,用于声明可以在编译时计算的常量表达式。...而constexpr允许将变量声明为constexpr类型,让编译器来验证变量的值是否是常量表达式。...1.2 constexpr变量声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化。...constexpr变量,那么该函数必须是constexpr函数。...代码可读性:明确地指出哪些变量和函数是用于编译时常量计算的,使代码更加清晰易懂。例如,在定义数组大小时使用constexpr变量,能让其他开发者一眼看出数组大小是在编译时确定的。
C++ constexpr解法 其实模板元解法和constexpr解法能力相同,只是实现代价不同,后者更容易实现,写起来就像普通函数一样。...延伸一下,如果你细心的话,你会发现输出大小需要手动指定(默认15字节),如果大小过大,那么多余的空间浪费了;如果大小过小,编译报错。思考一下,有什么办法确定大小呢?...我们可以实现一个函数brain_fuck_output_size来提前计算好所需要大小: // calculate output size constexpr auto brain_fuck_output_size...C++版本实现过程中可以先不加constexpr关键字,通过打印等debug手段调试通过后,最终加上constexpr关键字即可,最后既可以在运行时使用,也可以在编译时使用。...而Rust的过程宏只能用在编译时,无法用在运行时,而且只支持字面量方式,不支持变量传参给过程宏。
template using vector3 = Vector typedef Vector3 Vector3F 2.size_t 当你看到一个对象声明为size_t类型,你马上就知道它代表字节大小或数组索引...…to do something } 表示传入的是i的地址如果是等于[=],则是传值 6.mutable关键字作用在成员变量前,即使某一个非静态方法后加了const(即不能修改该函数的类里的任何一个变量...),也可以修改改变量 7constexpr:constexpr是C++11中新增的关键字,其语义是“常量表达式”,也就是在编译期可求值的表达式。...注意,constexpr构造函数必须有一个空的函数体,即所有成员变量的初始化都放到初始化列表中。 假如你将一个成员函数标记为constexpr,则顺带也将它标记为了const。...如果你将一个变量标记为constexpr,则同样它是const的。但相反并不成立,一个const的变量或函数,并不是constexpr的。
例如,数组大小、数学常量等。 运行时常量:如果值在运行时确定,但在整个程序运行期间不变,使用 const。例如,配置参数、运行时计算结果等。...可以与模板结合使用,实现更强大的编译时计算。...constexpr 可以修饰变量和函数,确保它们在编译期求值。 函数修饰: const 修饰成员函数,表示该成员函数不会修改类的成员变量。 constexpr 修饰函数,表示该函数可以在编译期求值。...实践建议 逐步引入 constexpr:如果你不确定某个变量或函数是否应该是 constexpr,可以先将其声明为 const 或普通函数,然后逐步引入 constexpr,并观察编译器的反馈。...总结 const:主要用于修饰变量、指针、函数参数和成员函数,表示这些对象在运行时不可变。适用于运行时常量和不可变参数。 constexpr:主要用于修饰变量和函数,表示这些对象在编译期求值。
我们将直面整型长度在不同平台下的潜规则,剖析const在变量、指针与引用中的三重语义,并探究static与inline如何借助局部性原理影响性能。...;malloc需要显式支出申请的内存大小 可以使用operator对new进行重载;malloc不允许被重载 new会调用对象的构造、析构函数;malloc并不会 new\delete是C++运算符;malloc...反之则不成立,一个函数或者变量是const的,并不就是constexpr的。...constexpr变量 d我们可使用constexpr来声明一个变量,由编译器来验证一个变量的值是否是常量表达式: 也就是说使用constexpr来声明变量,必须使用常量表达式进行初始化。...如果我们使用constexpr来声明定义一个指针,constexpr只对于指针有效,与指针所指向的对象无关: constexpr int* p1 = nullptr; // 编译期常量指针,指针值在编译期已知
constexpr关键字的作用:声明一个常量表达式,要求在编译时期计算出结果,以产生一个编译时常量。可以用于定义常量、函数等,通常用于需要在编译时进行计算的场景,例如数组大小、模板参数等。...constexpr变量可以作为数组的长度、枚举的值、模板参数等。与const变量不同,constexpr变量的值在编译时即确定,因此可以作为编译时常量来使用。...constexpr:constexpr关键字用于声明常量表达式,它要求变量或函数在编译时就能得到计算结果。对于constexpr变量,编译器会在编译期间进行常量表达式的求值,而不是在运行时。...constexpr:constexpr 可以用于声明常量,可以赋值给变量、函数、模板参数和构造函数的初始化器。...constexpr 允许编译器在编译时进行计算,并且可以在一些上下文中被用于要求常量表达式的场合(比如数组大小、模板参数等)。
说向只读位置写数据 cout << *ite2 << endl; cout << *ite3 << endl; return 0; } 从这里可以看出来,编译器应该是根据左边变量的类型来决定到底要调用哪个函数的...size、max_size、empty函数 函数原型如下: constexpr size_type size() const noexcept { return _Nm; } constexpr size_type...operator[]和at函数都实现了两个,与上面的迭代器一样,根据左值判断具体调用哪一个函数。...front、back、data函数 array容器是不存在push之类往里面写数据的函数的,因为它容量固定,但它也提供了从头和尾取数据的函数: _GLIBCXX17_CONSTEXPR reference...noexcept { return _AT_Type::_S_ptr(_M_elems); } 其实仔细看就会发现,front和back返回的就是引用,与下标和at类型一致,而data返回的则是指针与迭代器使用一致
❝下列函数或宏均来自Qt的qglobal.h头文件。...Class(const Class &) Q_DECL_EQ_DELETE;\ Class &operator=(const Class &) Q_DECL_EQ_DELETE; 设置某个环境变量...Q_CORE_EXPORT bool qputenv(const char *varName, const QByteArray& value); 获取某个环境变量 Q_CORE_EXPORT QByteArray...Q_CORE_EXPORT void qsrand(uint seed); Q_CORE_EXPORT int qrand(); 相当于while(1) #define Q_FOREVER for(;;) D指针与Q...指针,主要用于隐藏数据和二进制兼容实现。
一个constexpr指针的初始值必须是nullptr或者0,或者是存储于某个固定地址中的对象(如全局变量、静态变量等)。...constexpr变量 在一个复杂的系统中,很难(几乎肯定不可能)分辨一个初始值到底是不是常量表达式。...从C++11开始,规定允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式。声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化。...()是一个constexpr函数时,才是常量表达式,否则语句错误 constexpr指针 需要注意的是,与const关键字不同,一个指针被定义为constexpr,关键字仅对指针有效,与指针所指的对象无关...与const指针类似,constexpr指针既可以指向常量也可以指向一个非常量。
这些上下文环境主要包含的场景有:只使用字面变量、没有静态类型、没有虚函数、没有异常捕获及new/delete的上下文环境。...squared2(5)> a; std::cout << squared2(5) << '\n'; return 0; } 如上代码片段中,第6行代码将lambda中计算的值当做array数组的大小在编译时将会报错...因为在lambda中声明了一个static类型的变量,那么表达式也将失去constepr的能力,既不能在编译器使用。...}; return 0; } 如上squqr1是在表达式中使用constexpr,squar2则是在变量前使用constexpr,他们表达的含义是不同的,第一种写法是在编译器执行,第二种表示的是在编译器就会对变量进行赋值...但是最终被接受的正式谈是由Faisal Vali、Jens Maurer、 Richard Smith 发表于https://wg21.link/p0170r1。
常见误区(反常识): • const 修饰变量 分配内存空间吗?...• const 变量:虽然安全,但在 C++11 之前,const不保证编译期常量。 • inline 函数:通过内联展开减少函数调用开销,但依然在 运行期计算。...二、技术优势与劣势 特性 inline const / constexpr 编译期元编程(模板 + constexpr) 目标 减少函数调用开销 固定值、优化常量表达式 利用编译期完成复杂逻辑 性能 消除调用栈...五、与模板元编程结合:C++17/20 的 constexpr 进化 在 C++17 和 C++20,constexpr 与 模板元编程 深度结合,让我们能写出接近函数式语言的代码: template...六、总结与实践建议 技术 用途 收益 注意事项 inline 展开函数,消除调用开销 小幅提升性能 代码膨胀 constexpr 编译期计算 避免运行期重复计算,零开销 C++11 受限,C++14+
示例: constexpr int x = 5; 这里,x的值在编译期就确定为5。 const 定义:const表示变量在运行期间不能被修改,但不保证在编译期求值。...调试支持 支持 支持 不支持 重载 支持 支持 不支持 二、函数定义 constexpr函数 定义:constexpr函数可以在编译期被调用,生成常量表达式。...const 类型安全:保证变量或对象状态不变,增强代码的可靠性。 不修改状态:适用于需要保证对象状态不变的场景,如成员函数。...四、使用场景 constexpr 适用场景:需要在编译期确定值的场景,如模板元编程、数组大小定义等。 const 适用场景:需要保证变量或对象状态不变的场景,不强调编译期求值。...const则在保证变量或对象状态不变方面有其独特的用途,而#define在一些特定的场景中仍有其简洁性和兼容性的优势。选择使用哪种方式定义常量或函数应根据具体的需求和代码的上下文来决定。
C++11将这些类型推导手段进行了细致的考量,最终标准化为auto与decltype。decltype与auto关键字类似,用于编译时类型推导,不过它与auto还是有一些区别的。...函数时,k才是一个常量表达式 必须明确一点,在constexpr声明中,如果定义了一个指针,constexpr仅对指针有效,与指针所指对象无关。...5.3 constexpr与const的区别 const可以修饰函数参数、函数返回值、函数本身、类等,在不同的使用场景下,const具有不同的意义,不过大多数情况下,const描述的是“运行时常量性”,...constexpr可以修饰函数参数、函数返回值、变量、类的构造函数、函数模板等,是一种比const更加严格的约束,它修饰的表达式除了具有“运行时常量性”,也具有“编译时常量性”,即constexpr修饰的表达式的值在编译期间可知...11.alignas与alignof 内存对齐指变量起始存储地址和类型大小是对齐字节数的整数倍。例如某个int型变量,其起始存储地址0x0000CC04是4的整数倍,那么这个变量就是对齐的。
1. constexpr 函数中使用非字面量变量、标号和 goto (P2242R3)在 C++23 之前,constexpr 函数的使用受到较多限制,不能在其中使用非字面量变量、标号和 goto 语句...C++23 打破了这个限制,允许在 constexpr 函数的常量表达式中使用这两种变量。这为编译时计算提供了更多的可能性,例如可以在编译时初始化一些静态变量或线程局部变量。..."[n];}也可以将 static 变量移到非局部作用域,但我们希望将其设为局部变量是有原因的,它只与这个特定的函数相关:static constexpr char digits[] = "0123456789abcdef...函数中使用非字面量变量、标号和 gotoP2242R3放宽了 constexpr 函数的使用限制,允许使用非字面量变量、标号和 goto 语句,只要在编译时不被求值即可,GCC 12 和 Clang...变量的限制,之前 static 变量相关规则在 P2242R3 中有所调整,现在 static constexpr 变量在 constexpr 函数中使用更合理constexpr 函数的返回类型和形参类型不必为字面类型
往期对这个特性的全面阐述文章:C++17那些事开篇之类模版参数推导(CTAD) 例如下面函数模版的例子(C++17之前): template void foo(T t) {...这使我们能够创建一个通用的结构 foo,可以与任何接受任意数量类型参数的模板一起工作,例如 std::vector、std::list 或用户定义的模板。 9....内联变量 C++17允许在类的定义内部定义变量为内联的,这可以帮助减小二进制大小,可能通过防止变量在多个转换单元中的重复副本来提高性能。...Lambda C++17允许lambda函数成为constexpr,如果它们满足条件,就可以在需要编译时评估的上下文中使用,例如: constexpr auto lambda = [](int x)...例如: if constexpr (std::is_same_v) { // 用于int的特定代码 } else { // 用于其他类型的代码 } 在这个例子中,if constexpr
C++20 引入了 consteval 和 constinit 两个新关键字,它们与 constexpr 一起,为编译时计算和变量初始化提供了更强大的支持。以下是对这两个特性的详细介绍和用法。...与 constexpr 函数不同,consteval 函数必须在编译时计算,而不能在运行时调用。...非常量变量:与 constexpr 不同,constinit 不要求变量是常量,变量可以在运行时修改。适用范围:只能用于具有静态或线程存储期限的变量,不能用于局部变量。...使用场景consteval:用于生成编译时常量,例如数组大小或类型特征。避免运行时计算,提升性能。constinit:避免静态初始化顺序问题(SIOF)。...它们与 constexpr 一起,为现代 C++ 的编译时优化提供了更丰富的支持。
以下是 constexpr 的详细解释: unsetunset1. 基本概念unsetunset constexpr 指定一个表达式或函数在编译时求值。 它可以用于变量、函数和类构造函数。...用于变量unsetunset 当 constexpr 用于变量时,该变量必须是一个常量表达式,即它的值在编译时就可以确定。 示例:constexpr int a = 5; unsetunset3....用于函数unsetunset 当 constexpr 用于函数时,该函数必须满足一定的要求,才能确保其在编译时可以计算。 函数体通常很简单,只包含返回语句。...函数只能调用其他 constexpr 函数。 函数的参数和返回类型必须是字面类型(例如,整数、浮点数、指针、字面类类型的对象等)。...与其他特性的结合unsetunset constexpr 可以与 inline 一起使用,以鼓励编译器进行内联。
目录 一、常量表达式 二、constexpr变量 三、constexpr函数 四、字面值类型 五、指针和constexpr 六、字面值常量类 参考 一、常量表达式 常量表达式(const expression...C++11新标准规定,允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式。 声明为constexpr的变量一定是一个常量。 必须用常量表达式初始化。...new_sz函数返回的是常量表达式,所以可以用new_sz函数初始化constexpr类型的变量foo。...一个constexpr指针的初始值必须是nullptr或者0,或者是存储在某个固定地址中的对象。 函数体内定义的变量一般来说并非存放在固定地址中,因此constexpr指针不能指向这样的变量。...五、指针和constexpr (1)如果在constexpr声明中定义了一个指针,限定符constexpr仅对指针有效,与指针所指的对象无关。