
文章目录
-
- [1. `std::aligned_storage` 与 `std::aligned_union`](#1.
std::aligned_storage
与std::aligned_union
) -
- [1.1 特性介绍](#1.1 特性介绍)
- [1.2 被弃用的原因](#1.2 被弃用的原因)
- [1.3 替代方案](#1.3 替代方案)
- [2. `std::numeric_limits::has_denorm`](#2.
std::numeric_limits::has_denorm
) -
- [2.1 特性介绍](#2.1 特性介绍)
- [2.2 被弃用的原因](#2.2 被弃用的原因)
- [3. 总结](#3. 总结)
- [1. `std::aligned_storage` 与 `std::aligned_union`](#1.
C++23 已弃用特性包括:std::aligned_storage、std::aligned_union 与 std::numeric_limits::has_denorm
在C++的发展历程中,标准库不断演进,一些特性会随着时间推移而被弃用。C++23 中,std::aligned_storage
与 std::aligned_union
(提案 P1413R3)以及 std::numeric_limits::has_denorm
(提案 P2614R2)就被列入了弃用名单。下面我们来详细了解这些特性以及它们被弃用的原因。
1. std::aligned_storage
与 std::aligned_union
1.1 特性介绍
std::aligned_storage
是 C++11 引入的一个模板结构,定义在 <type_traits>
头文件中,用于创建具有特定大小和对齐要求的未初始化存储空间。它主要用于需要手动管理内存对齐的场景,确保在使用某些类型时不会出现对齐问题。其语法如下:
cpp
template <std::size_t Len, std::size_t Align = alignof(std::max_align_t)>
struct aligned_storage;
其中,Len
表示所要分配的存储空间的大小(以字节为单位),Align
表示存储空间的对齐要求(以字节为单位),默认值为 std::max_align_t
,即该值将会满足所有数据类型的对齐要求,该值由编译器和系统共同决定。例如,在 x86 - 64 平台上,最大对齐值通常是 16 个字节,因为 long double
类型的对齐值是 16 个字节;在 ARM 平台上,最大对齐值可能会是 8 个字节,因为 double
类型的对齐值是 8 个字节。
使用如下语句可以得到一个类型:
cpp
std::aligned_storage<20,4>::type // 定义了一个20字节为大小,4字节对齐(地址为4的倍数)的内存块类型
上述语句定义了一个 20 字节为大小,4 字节对齐(地址为 4 的倍数)的内存块类型,使用该类型可以在堆空间或栈空间上分配该内存块。
std::aligned_union
与 std::aligned_storage
类似,也用于创建具有特定对齐要求的存储,不过它更侧重于联合类型的存储。
1.2 被弃用的原因
std::aligned_storage
和 std::aligned_union
被弃用的主要原因是它们不能很好地满足实际使用需求。例如,aligned_storage
不能保证准确适应存储需求,其规格说明简单,只保证成员类型 type
是一个简单的标准布局类型,适合用作任何大小至多为 Len
且对齐方式是对齐的除数的对象的未初始化存储,但不能保证它能够准确地适应。也就是说,保证 aligned_storage<16>::type
至少为 16 个字节,但是一个符合标准的实现可以轻松地为您提供 32 个字节或 4K 字节。这就可能导致意外使用,给开发者带来困扰。
1.3 替代方案
可以使用类似 libstdc++
的 __aligned_membuf
来替代,示例代码如下:
cpp
template <typename T>
struct storage_for {
alignas(T) std::byte data[sizeof(T)];
// 可以添加一些有用的构造函数和方法,可能还会有一个返回 T* 或 T const* 的获取器
};
2. std::numeric_limits::has_denorm
2.1 特性介绍
std::numeric_limits
是 C++ 标准库中的一个模板类,定义在 <limits>
头文件中,它提供了查询各种算术类型属性的标准化方式。例如,std::numeric_limits<int>::max()
可以获取 int
类型的最大可能值。
std::numeric_limits::has_denorm
是 std::numeric_limits
类的一个静态成员常量,用于鉴别浮点类型所用的非正规风格。其值可以是以下几种情况:
std::denorm_absent
:表示该类型不支持非正规值。std::denorm_present
:表示该类型支持非正规值。
标准特化中,对于大多数整数类型,has_denorm
的值为 std::denorm_absent
;对于 float
、double
和 long double
类型,通常为 std::denorm_present
。
2.2 被弃用的原因
目前尚未找到明确的官方文档说明 std::numeric_limits::has_denorm
被弃用的原因,但推测可能是随着浮点运算标准的发展和完善,这个特性的实用性逐渐降低,或者有更好的替代方式来处理相关的浮点类型属性查询。
3. 总结
C++ 标准库的不断更新和弃用一些特性是为了让语言更加简洁、安全和高效。虽然 std::aligned_storage
、std::aligned_union
和 std::numeric_limits::has_denorm
被弃用了,但我们可以通过了解它们被弃用的原因,学习到如何更好地使用 C++ 进行编程,避免使用这些可能带来问题的特性,并采用更合适的替代方案。