c++ - 如何理解reinterpret_cast<void*>的用法?
ringa_lee
ringa_lee 2017-04-17 13:16:32
0
2
707

最近看到一段代码,如下:

 static size_type _S_empty_rep_storage[];
 static _Rep& _S_empty_rep() _GLIBCXX_NOEXCEPT
  { 
      // NB: Mild hack to avoid strict-aliasing warnings.  Note that
      // _S_empty_rep_storage is never modified and the punning should
      // be reasonably safe in this case.
      void* __p = reinterpret_cast<void*>(&_S_empty_rep_storage);
      return *reinterpret_cast<_Rep*>(__p);
    }

这里为何要先转换为void*, 为什么不直接转换为_Rep* ?

ringa_lee
ringa_lee

ringa_lee

全部回覆(2)
Peter_Zhu

上面註解不是寫了麼,避免strict-aliasing警告。
至於為什麼要避免警告呢,Werror會把所有警告視為錯誤
關於這個警告可以看一下這兩篇文章
http://cellperformance.beyond3d.com/articles/2006/06/ understanding-strict-aliasing.html
http://blog.csdn.net/dbzhang800/article/details/6720141

刘奇

如果直接轉成_Rep*,編譯器在啟用某些限制級別後會給出警告(strict-aliasing Warning),而作者想讓編譯器閉嘴,就用了一個"hack",先轉成void*再轉成_Rep*,而這分別的兩步編譯器不會給予警告。
實際上中這麼做是為了避開一些程式碼檢查限制,並不會帶來實際上的好處,反而可能因為忽略編譯器的警告而引入潛在的bug。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!