dsphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextEnglish}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget$/process/volatile-considered-harmfulmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Simplified)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget7/translations/zh_CN/process/volatile-considered-harmfulmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget7/translations/it_IT/process/volatile-considered-harmfulmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget7/translations/ja_JP/process/volatile-considered-harmfulmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget7/translations/ko_KR/process/volatile-considered-harmfulmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget7/translations/sp_SP/process/volatile-considered-harmfulmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageChinese (Traditional)uh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhd/var/lib/git/docbuild/linux/Documentation/translations/zh_TW/process/volatile-considered-harmful.rsthKubhtarget)}(h#.. _tw_volatile_considered_harmful:h]h}(h]h ]h"]h$]h&]refidtw-volatile-considered-harmfuluh1hhKhhhhhhubhwarning)}(hX1此文件的目的是爲讓中文讀者更容易閱讀和理解,而不是作爲一個分支。因此, 如果您對此文件有任何意見或改動,請先嘗試更新原始英文文件。如果要更改或 修正某處翻譯文件,請將意見或補丁發送給維護者(聯繫方式見下)。h]h paragraph)}(hX1此文件的目的是爲讓中文讀者更容易閱讀和理解,而不是作爲一個分支。因此, 如果您對此文件有任何意見或改動,請先嘗試更新原始英文文件。如果要更改或 修正某處翻譯文件,請將意見或補丁發送給維護者(聯繫方式見下)。h]hX1此文件的目的是爲讓中文讀者更容易閱讀和理解,而不是作爲一個分支。因此, 如果您對此文件有任何意見或改動,請先嘗試更新原始英文文件。如果要更改或 修正某處翻譯文件,請將意見或補丁發送給維護者(聯繫方式見下)。}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hh5Documentation/translations/zh_TW/disclaimer-zh_TW.rsthKhhubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubhnote)}(h如果您發現本文檔與原始文件有任何不同或者有翻譯問題,請聯繫該文件的譯者, 或者發送電子郵件給胡皓文以獲取幫助:<2023002089@link.tyut.edu.cn>。h]h)}(h如果您發現本文檔與原始文件有任何不同或者有翻譯問題,請聯繫該文件的譯者, 或者發送電子郵件給胡皓文以獲取幫助:<2023002089@link.tyut.edu.cn>。h](h如果您發現本文檔與原始文件有任何不同或者有翻譯問題,請聯繫該文件的譯者, 或者發送電子郵件給胡皓文以獲取幫助:<}(hhhhhNhNubh reference)}(h2023002089@link.tyut.edu.cnh]h2023002089@link.tyut.edu.cn}(hhhhhNhNubah}(h]h ]h"]h$]h&]refuri"mailto:2023002089@link.tyut.edu.cnuh1hhhubh>。}(hhhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK hhubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh field_list)}(hhh]hfield)}(hhh](h field_name)}(hOriginalh]hOriginal}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhKubh field_body)}(h[:ref:`Documentation/process/volatile-considered-harmful.rst ` h]h)}(hZ:ref:`Documentation/process/volatile-considered-harmful.rst `h]h)}(hj1h]hinline)}(hj1h]h5Documentation/process/volatile-considered-harmful.rst}(hj8hhhNhNubah}(h]h ](xrefstdstd-refeh"]h$]h&]uh1j6hj3ubah}(h]h ]h"]h$]h&]refdoc6translations/zh_TW/process/volatile-considered-harmful refdomainjCreftyperef refexplicitrefwarn reftargetvolatile_considered_harmfuluh1hhhhKhj/ubah}(h]h ]h"]h$]h&]uh1hhhhKhj+ubah}(h]h ]h"]h$]h&]uh1j)hjubeh}(h]h ]h"]h$]h&]uh1jhhhKhjhhubah}(h]h ]h"]h$]h&]uh1jhhhhhhhKubh)}(h如果想評論或更新本文的內容,請直接聯繫原文檔的維護者。如果你使用英文 交流有困難的話,也可以向中文版維護者求助。如果本翻譯更新不及時或者翻 譯存在問題,請聯繫中文版維護者::h]h如果想評論或更新本文的內容,請直接聯繫原文檔的維護者。如果你使用英文 交流有困難的話,也可以向中文版維護者求助。如果本翻譯更新不及時或者翻 譯存在問題,請聯繫中文版維護者:}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhhhubh literal_block)}(hX英文版維護者: Jonathan Corbet 中文版維護者: 伍鵬 Bryan Wu 中文版翻譯者: 伍鵬 Bryan Wu 中文版校譯者: 張漢輝 Eugene Teo 楊瑞 Dave Young 時奎亮 Alex Shi 胡皓文 Hu Haowen <2023002089@link.tyut.edu.cn>h]hX英文版維護者: Jonathan Corbet 中文版維護者: 伍鵬 Bryan Wu 中文版翻譯者: 伍鵬 Bryan Wu 中文版校譯者: 張漢輝 Eugene Teo 楊瑞 Dave Young 時奎亮 Alex Shi 胡皓文 Hu Haowen <2023002089@link.tyut.edu.cn>}hjsbah}(h]h ]h"]h$]h&]hhuh1j}hhhKhhhhubhsection)}(hhh](htitle)}(h,爲什麼不應該使用“volatile”類型h]h,爲什麼不應該使用“volatile”類型}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhhhKubh)}(hXC程序員通常認爲volatile表示某個變量可以在當前執行的線程之外被改變;因此,在內核 中用到共享數據結構時,常常會有C程序員喜歡使用volatile這類變量。換句話說,他們經 常會把volatile類型看成某種簡易的原子變量,當然它們不是。在內核中使用volatile幾 乎總是錯誤的;本文檔將解釋爲什麼這樣。h]hXC程序員通常認爲volatile表示某個變量可以在當前執行的線程之外被改變;因此,在內核 中用到共享數據結構時,常常會有C程序員喜歡使用volatile這類變量。換句話說,他們經 常會把volatile類型看成某種簡易的原子變量,當然它們不是。在內核中使用volatile幾 乎總是錯誤的;本文檔將解釋爲什麼這樣。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hXg理解volatile的關鍵是知道它的目的是用來消除優化,實際上很少有人真正需要這樣的應 用。在內核中,程序員必須防止意外的併發訪問破壞共享的數據結構,這其實是一個完全 不同的任務。用來防止意外併發訪問的保護措施,可以更加高效的避免大多數優化相關的 問題。h]hXg理解volatile的關鍵是知道它的目的是用來消除優化,實際上很少有人真正需要這樣的應 用。在內核中,程序員必須防止意外的併發訪問破壞共享的數據結構,這其實是一個完全 不同的任務。用來防止意外併發訪問的保護措施,可以更加高效的避免大多數優化相關的 問題。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hX像volatile一樣,內核提供了很多原語來保證併發訪問時的數據安全(自旋鎖, 互斥量,內 存屏障等等),同樣可以防止意外的優化。如果可以正確使用這些內核原語,那麼就沒有 必要再使用volatile。如果仍然必須使用volatile,那麼幾乎可以肯定在代碼的某處有一 個bug。在正確設計的內核代碼中,volatile能帶來的僅僅是使事情變慢。h]hX像volatile一樣,內核提供了很多原語來保證併發訪問時的數據安全(自旋鎖, 互斥量,內 存屏障等等),同樣可以防止意外的優化。如果可以正確使用這些內核原語,那麼就沒有 必要再使用volatile。如果仍然必須使用volatile,那麼幾乎可以肯定在代碼的某處有一 個bug。在正確設計的內核代碼中,volatile能帶來的僅僅是使事情變慢。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK#hjhhubh)}(h)思考一下這段典型的內核代碼::h]h(思考一下這段典型的內核代碼:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK(hjhhubj~)}(hrspin_lock(&the_lock); do_something_on(&shared_data); do_something_else_with(&shared_data); spin_unlock(&the_lock);h]hrspin_lock(&the_lock); do_something_on(&shared_data); do_something_else_with(&shared_data); spin_unlock(&the_lock);}hjsbah}(h]h ]h"]h$]h&]hhuh1j}hhhK*hjhhubh)}(hX4如果所有的代碼都遵循加鎖規則,當持有the_lock的時候,不可能意外的改變shared_data的 值。任何可能訪問該數據的其他代碼都會在這個鎖上等待。自旋鎖原語跟內存屏障一樣—— 它 們顯式的用來書寫成這樣 —— 意味着數據訪問不會跨越它們而被優化。所以本來編譯器認爲 它知道在shared_data裏面將有什麼,但是因爲spin_lock()調用跟內存屏障一樣,會強制編 譯器忘記它所知道的一切。那麼在訪問這些數據時不會有優化的問題。h]hX4如果所有的代碼都遵循加鎖規則,當持有the_lock的時候,不可能意外的改變shared_data的 值。任何可能訪問該數據的其他代碼都會在這個鎖上等待。自旋鎖原語跟內存屏障一樣—— 它 們顯式的用來書寫成這樣 —— 意味着數據訪問不會跨越它們而被優化。所以本來編譯器認爲 它知道在shared_data裏面將有什麼,但是因爲spin_lock()調用跟內存屏障一樣,會強制編 譯器忘記它所知道的一切。那麼在訪問這些數據時不會有優化的問題。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK/hjhhubh)}(hXm如果shared_data被聲名爲volatile,鎖操作將仍然是必須的。就算我們知道沒有其他人正在 使用它,編譯器也將被阻止優化對臨界區內shared_data的訪問。在鎖有效的同時, shared_data不是volatile的。在處理共享數據的時候,適當的鎖操作可以不再需要 volatile —— 並且是有潛在危害的。h]hXm如果shared_data被聲名爲volatile,鎖操作將仍然是必須的。就算我們知道沒有其他人正在 使用它,編譯器也將被阻止優化對臨界區內shared_data的訪問。在鎖有效的同時, shared_data不是volatile的。在處理共享數據的時候,適當的鎖操作可以不再需要 volatile —— 並且是有潛在危害的。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK5hjhhubh)}(hXvolatile的存儲類型最初是爲那些內存映射的I/O寄存器而定義。在內核裏,寄存器訪問也應 該被鎖保護,但是人們也不希望編譯器“優化”臨界區內的寄存器訪問。內核裏I/O的內存訪問 是通過訪問函數完成的;不贊成通過指針對I/O內存的直接訪問,並且不是在所有體系架構上 都能工作。那些訪問函數正是爲了防止意外優化而寫的,因此,再說一次,volatile類型不 是必需的。h]hXvolatile的存儲類型最初是爲那些內存映射的I/O寄存器而定義。在內核裏,寄存器訪問也應 該被鎖保護,但是人們也不希望編譯器“優化”臨界區內的寄存器訪問。內核裏I/O的內存訪問 是通過訪問函數完成的;不贊成通過指針對I/O內存的直接訪問,並且不是在所有體系架構上 都能工作。那些訪問函數正是爲了防止意外優化而寫的,因此,再說一次,volatile類型不 是必需的。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK:hjhhubh)}(h另一種引起用戶可能使用volatile的情況是當處理器正忙着等待一個變量的值。正確執行一 個忙等待的方法是::h]h另一種引起用戶可能使用volatile的情況是當處理器正忙着等待一個變量的值。正確執行一 個忙等待的方法是:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK@hjhhubj~)}(h3while (my_variable != what_i_want) cpu_relax();h]h3while (my_variable != what_i_want) cpu_relax();}hj sbah}(h]h ]h"]h$]h&]hhuh1j}hhhKChjhhubh)}(hcpu_relax()調用會降低CPU的能量消耗或者讓位於超線程雙處理器;它也作爲內存屏障一樣出 現,所以,再一次,volatile不是必需的。當然,忙等待一開始就是一種反常規的做法。h]hcpu_relax()調用會降低CPU的能量消耗或者讓位於超線程雙處理器;它也作爲內存屏障一樣出 現,所以,再一次,volatile不是必需的。當然,忙等待一開始就是一種反常規的做法。}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKFhjhhubh)}(hG在內核中,一些稀少的情況下volatile仍然是有意義的:h]hG在內核中,一些稀少的情況下volatile仍然是有意義的:}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKIhjhhubh block_quote)}(hX- 在一些體系架構的系統上,允許直接的I/0內存訪問,那麼前面提到的訪問函數可以使用 volatile。基本上,每一個訪問函數調用它自己都是一個小的臨界區域並且保證了按照 程序員期望的那樣發生訪問操作。 - 某些會改變內存的內聯彙編代碼雖然沒有什麼其他明顯的附作用,但是有被GCC刪除的可 能性。在彙編聲明中加上volatile關鍵字可以防止這種刪除操作。 - Jiffies變量是一種特殊情況,雖然每次引用它的時候都可以有不同的值,但讀jiffies 變量時不需要任何特殊的加鎖保護。所以jiffies變量可以使用volatile,但是不贊成 其他跟jiffies相同類型變量使用volatile。Jiffies被認爲是一種“愚蠢的遺留物" (Linus的話)因爲解決這個問題比保持現狀要麻煩的多。 - 由於某些I/0設備可能會修改連續一致的內存,所以有時,指向連續一致內存的數據結構 的指針需要正確的使用volatile。網絡適配器使用的環狀緩存區正是這類情形的一個例 子,其中適配器用改變指針來表示哪些描述符已經處理過了。 h]h bullet_list)}(hhh](h list_item)}(hX在一些體系架構的系統上,允許直接的I/0內存訪問,那麼前面提到的訪問函數可以使用 volatile。基本上,每一個訪問函數調用它自己都是一個小的臨界區域並且保證了按照 程序員期望的那樣發生訪問操作。 h]h)}(hX在一些體系架構的系統上,允許直接的I/0內存訪問,那麼前面提到的訪問函數可以使用 volatile。基本上,每一個訪問函數調用它自己都是一個小的臨界區域並且保證了按照 程序員期望的那樣發生訪問操作。h]hX在一些體系架構的系統上,允許直接的I/0內存訪問,那麼前面提到的訪問函數可以使用 volatile。基本上,每一個訪問函數調用它自己都是一個小的臨界區域並且保證了按照 程序員期望的那樣發生訪問操作。}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKKhjWubah}(h]h ]h"]h$]h&]uh1jUhjRubjV)}(h某些會改變內存的內聯彙編代碼雖然沒有什麼其他明顯的附作用,但是有被GCC刪除的可 能性。在彙編聲明中加上volatile關鍵字可以防止這種刪除操作。 h]h)}(h某些會改變內存的內聯彙編代碼雖然沒有什麼其他明顯的附作用,但是有被GCC刪除的可 能性。在彙編聲明中加上volatile關鍵字可以防止這種刪除操作。h]h某些會改變內存的內聯彙編代碼雖然沒有什麼其他明顯的附作用,但是有被GCC刪除的可 能性。在彙編聲明中加上volatile關鍵字可以防止這種刪除操作。}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKOhjoubah}(h]h ]h"]h$]h&]uh1jUhjRubjV)}(hXJiffies變量是一種特殊情況,雖然每次引用它的時候都可以有不同的值,但讀jiffies 變量時不需要任何特殊的加鎖保護。所以jiffies變量可以使用volatile,但是不贊成 其他跟jiffies相同類型變量使用volatile。Jiffies被認爲是一種“愚蠢的遺留物" (Linus的話)因爲解決這個問題比保持現狀要麻煩的多。 h]h)}(hXJiffies變量是一種特殊情況,雖然每次引用它的時候都可以有不同的值,但讀jiffies 變量時不需要任何特殊的加鎖保護。所以jiffies變量可以使用volatile,但是不贊成 其他跟jiffies相同類型變量使用volatile。Jiffies被認爲是一種“愚蠢的遺留物" (Linus的話)因爲解決這個問題比保持現狀要麻煩的多。h]hXJiffies變量是一種特殊情況,雖然每次引用它的時候都可以有不同的值,但讀jiffies 變量時不需要任何特殊的加鎖保護。所以jiffies變量可以使用volatile,但是不贊成 其他跟jiffies相同類型變量使用volatile。Jiffies被認爲是一種“愚蠢的遺留物” (Linus的話)因爲解決這個問題比保持現狀要麻煩的多。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKRhjubah}(h]h ]h"]h$]h&]uh1jUhjRubjV)}(hX0由於某些I/0設備可能會修改連續一致的內存,所以有時,指向連續一致內存的數據結構 的指針需要正確的使用volatile。網絡適配器使用的環狀緩存區正是這類情形的一個例 子,其中適配器用改變指針來表示哪些描述符已經處理過了。 h]h)}(hX/由於某些I/0設備可能會修改連續一致的內存,所以有時,指向連續一致內存的數據結構 的指針需要正確的使用volatile。網絡適配器使用的環狀緩存區正是這類情形的一個例 子,其中適配器用改變指針來表示哪些描述符已經處理過了。h]hX/由於某些I/0設備可能會修改連續一致的內存,所以有時,指向連續一致內存的數據結構 的指針需要正確的使用volatile。網絡適配器使用的環狀緩存區正是這類情形的一個例 子,其中適配器用改變指針來表示哪些描述符已經處理過了。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKWhjubah}(h]h ]h"]h$]h&]uh1jUhjRubeh}(h]h ]h"]h$]h&]bullet-uh1jPhhhKKhjLubah}(h]h ]h"]h$]h&]uh1jJhhhKKhjhhubh)}(hX對於大多代碼,上述幾種可以使用volatile的情況都不適用。所以,使用volatile是一種 bug並且需要對這樣的代碼額外仔細檢查。那些試圖使用volatile的開發人員需要退一步想想 他們真正想實現的是什麼。h]hX對於大多代碼,上述幾種可以使用volatile的情況都不適用。所以,使用volatile是一種 bug並且需要對這樣的代碼額外仔細檢查。那些試圖使用volatile的開發人員需要退一步想想 他們真正想實現的是什麼。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK[hjhhubh)}(hg非常歡迎刪除volatile變量的補丁 - 只要證明這些補丁完整的考慮了併發問題。h]hg非常歡迎刪除volatile變量的補丁 - 只要證明這些補丁完整的考慮了併發問題。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK_hjhhubj)}(hhh](j)}(h註釋h]h註釋}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhhhKbubh)}(hI[1] https://lwn.net/Articles/233481/ [2] https://lwn.net/Articles/233482/h](h[1] }(hjhhhNhNubh)}(h https://lwn.net/Articles/233481/h]h https://lwn.net/Articles/233481/}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijuh1hhjubh [2] }(hjhhhNhNubh)}(h https://lwn.net/Articles/233482/h]h https://lwn.net/Articles/233482/}(hj hhhNhNubah}(h]h ]h"]h$]h&]refurijuh1hhjubeh}(h]h ]h"]h$]h&]uh1hhhhKdhjhhubeh}(h]id1ah ]h"]註釋ah$]h&]uh1jhjhhhhhKbubj)}(hhh](j)}(h致謝h]h致謝}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*hhhhhKhubh)}(h最初由Randy Dunlap推動並作初步研究 由Jonathan Corbet撰寫 參考Satyam Sharma,Johannes Stezenbach,Jesper Juhl,Heikki Orsila, H. Peter Anvin,Philipp Hahn和Stefan Richter的意見改善了本檔。h]h最初由Randy Dunlap推動並作初步研究 由Jonathan Corbet撰寫 參考Satyam Sharma,Johannes Stezenbach,Jesper Juhl,Heikki Orsila, H. Peter Anvin,Philipp Hahn和Stefan Richter的意見改善了本檔。}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKjhj*hhubeh}(h]id2ah ]h"]致謝ah$]h&]uh1jhjhhhhhKhubeh}(h]volatileah ]h"],爲什麼不應該使用“volatile”類型ah$]h&]uh1jhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(jN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerj|error_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}h]hasnameids}(tw_volatile_considered_harmfulhjVjSj'j$jNjKu nametypes}(jjVj'jNuh}(hj)}(hhh]j)}(hhh](j)}(horphanh]horphan}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhKubj*)}(hhh]h}(h]h ]h"]h$]h&]uh1j)hjubeh}(h]h ]orphanah"]h$]h&]uh1jhhhKhhdocinfo)}(hhh]jah}(h]h ]h"]h$]h&]uh1jhhhhhNhNubhhubah}(h]hah ]h"]jah$]h&]uh1jhhhhhhhKexpect_referenced_by_name}jhsexpect_referenced_by_id}hhsubjSjj$jjKj*u footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}jKsRparse_messages]transform_messages]hsystem_message)}(hhh]h)}(hhh]hDHyperlink target "tw-volatile-considered-harmful" is not referenced.}hj sbah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]levelKtypeINFOsourcehlineKuh1juba transformerN include_log]HDocumentation/translations/zh_TW/process/volatile-considered-harmful.rst(NNNNta decorationNhhub.