文章目錄
- 1. `std::aligned_storage` 與 `std::aligned_union`
- 1.1 特性介紹
- 1.2 被棄用的原因
- 1.3 替代方案
- 2. `std::numeric_limits::has_denorm`
- 2.1 特性介紹
- 2.2 被棄用的原因
- 3. 總結
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>
頭文件中,用于創建具有特定大小和對齊要求的未初始化存儲空間。它主要用于需要手動管理內存對齊的場景,確保在使用某些類型時不會出現對齊問題。其語法如下:
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 個字節。
使用如下語句可以得到一個類型:
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
來替代,示例代碼如下:
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++ 進行編程,避免使用這些可能帶來問題的特性,并采用更合適的替代方案。