Unveiling the Essence of Memory Laundering: A Deeper Dive into std::launder
In the realm of C standardization, P0137 introduces std::launder, a function template that addresses a subtle issue concerning unions, lifetime, and pointers.為了理解其目的,讓我們深入研究本文解決的特定問題以及我們需要確認的後續語言調整。
手頭的問題考慮以下代碼snippet:在此處執行匯總初始化,將u(x)的第一個成員設置為值1。作為n是一個const變量,編譯器假設u.x.n始終保留1。代碼:由於x是瑣碎的,因此我們可以在與舊的位置相同的位置創建一個新對象,從而使此代碼義面上有效。現在,新對象將其n個成員設置為2。
現在,讓我們嘗試訪問u.x.n.您期望結果是什麼?有直覺上很高。 The compiler, based on its assumption that const variables are immutable, optimizes the code, rendering the new value of u.x.n inaccessible.
struct X { const int n; }; union U { X x; float f; }; ... U u = {{ 1 }};
Enter std::launder: Memory Laundering
To circumvent this optimization, we need to "launder" our memory using std::launder.這是一個說明性的示例: assert(*std :: landere(&u.x.n)== 2); //Will be true.
Memory laundering prevents the compiler from tracing the origin of our object, allowing us to access the new value despite the const member.
struct X { const int n; }; union U { X x; float f; }; ... U u = {{ 1 }};Additional Use Cases
std::launder can also aid in other situations where data type changes or storage allocation semantics hinder direct訪問。 [&&&&&& &&&&&&華,sTD ::洗劫是一種強大的工具,它允許我們繞過某些可以阻礙我們正確訪問內存的能力的編譯器優化。通過洗滌內存,我們防止編譯器對其內容進行假設,以確保我們具有準確可靠的數據訪問。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3