C++23 已弃用特性

文章目录

    • [1. `std::aligned_storage` 与 `std::aligned_union`](#1. std::aligned_storagestd::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. 总结)

C++23 已弃用特性包括:std::aligned_storage、std::aligned_union 与 std::numeric_limits::has_denorm

在C++的发展历程中,标准库不断演进,一些特性会随着时间推移而被弃用。C++23 中,std::aligned_storagestd::aligned_union(提案 P1413R3)以及 std::numeric_limits::has_denorm(提案 P2614R2)就被列入了弃用名单。下面我们来详细了解这些特性以及它们被弃用的原因。

1. std::aligned_storagestd::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_unionstd::aligned_storage 类似,也用于创建具有特定对齐要求的存储,不过它更侧重于联合类型的存储。

1.2 被弃用的原因

std::aligned_storagestd::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_denormstd::numeric_limits 类的一个静态成员常量,用于鉴别浮点类型所用的非正规风格。其值可以是以下几种情况:

  • std::denorm_absent:表示该类型不支持非正规值。
  • std::denorm_present:表示该类型支持非正规值。

标准特化中,对于大多数整数类型,has_denorm 的值为 std::denorm_absent;对于 floatdoublelong double 类型,通常为 std::denorm_present

2.2 被弃用的原因

目前尚未找到明确的官方文档说明 std::numeric_limits::has_denorm 被弃用的原因,但推测可能是随着浮点运算标准的发展和完善,这个特性的实用性逐渐降低,或者有更好的替代方式来处理相关的浮点类型属性查询。

3. 总结

C++ 标准库的不断更新和弃用一些特性是为了让语言更加简洁、安全和高效。虽然 std::aligned_storagestd::aligned_unionstd::numeric_limits::has_denorm 被弃用了,但我们可以通过了解它们被弃用的原因,学习到如何更好地使用 C++ 进行编程,避免使用这些可能带来问题的特性,并采用更合适的替代方案。

相关推荐
oioihoii11 小时前
C++23 已移除特性解析
java·jvm·c++23
oioihoii4 天前
C++23 std::fstreams基础回顾
c++23
oioihoii4 天前
C++23 <spanstream>:基于 std::span 的高效字符串流处理
c++·算法·c++23
oioihoii5 天前
C++23:std::print和std::println格式化输出新体验
java·开发语言·c++23
oioihoii6 天前
C++23中std::span和std::basic_string_view可平凡复制提案解析
java·开发语言·c++23
oioihoii6 天前
C++23 新成员函数与字符串类型的改动
算法·c++23
oioihoii8 天前
C++23 对部分特性的 constexpr 支持
算法·c++23
oioihoii11 天前
C++23 容器推导指引中对于分配器的非推导语境(P1518R2)
c++23
oioihoii12 天前
C++23 新特性:允许 std::stack 与 std::queue 从迭代器对构造 (P1425R4)
c++23