內存: 0 1 2 ... (從低到高,以字節為單位)
exam exam低字節 exam高字節
內存: 0 bit 1 bit 2 bit ... (字節的各“位”)
EXAM_BIT A1 A2 A3
如下是68360 CPU生成短整數及位域的方式。
內存: 0 1 2 ... (從低到高,以字節為單位)
exam exam高字節 exam低字節
內存: 7 bit 6 bit 5 bit ... (字節的各“位”)
EXAM_BIT A1 A2 A3
說明:在對齊方式下,CPU的運行效率要快得多。
示例:如下圖,當一個long型數(如圖中long1)在內存中的位置正好與內存的字邊界對齊時,CPU存取這個數只需訪問一次內存,而當一個long型數(如圖中的long2)在內存中的位置跨越了字邊界時,CPU存取這個數就需要多次訪問內存,如i960cx訪問這樣的數需讀內存三次(一個BYTE、一個SHORT、一個BYTE,由CPU的微代碼執行,對軟件透明),所有對齊方式下CPU的運行效率明顯快多了。
1 8 16 24 32
------- ------- ------- -------
| long1 | long1 | long1 | long1 |
------- ------- ------- -------
| | | | long2 |
------- ------- ------- --------
| long2 | long2 | long2 | |
------- ------- ------- --------
| ....
〔六〕 =====[ 函數、過程 ]=====
¹6-1 :對所調用函數的錯誤返回碼要仔細、全面地處理
¹6-2 :明確函數功能,精確(而不是近似)地實現函數設計
¹6-3 :編寫可重入函數時,應注意局部變量的使用(如編寫C/C++ 語言的可重入函數時,應使用auto 即缺省態局部變量或寄存器變量)
說明:編寫C/C++語言的可重入函數時,不應使用static局部變量,否則必須經過特殊處理,才能使函數具有可重入性。
¹6-4 :編寫可重入函數時,若使用全局變量,則應通過關中斷、信號量(即P 、V 操作)等手段對其加以保護
說明:若對所使用的全局變量不加以保護,則此函數就不具有可重入性,即當多個進程調用此函數時,很有可能使有關全局變量變為不可知狀態。
示例:假設Exam是int型全局變量,函數Squre_Exam返回Exam平方值。那么如下函數不具有可重入性。
unsigned int example( int para )
{
unsigned int temp;
Exam = para; // (**)
temp = Square_Exam( );
return temp;
}
此函數若被多個進程調用的話,其結果可能是未知的,因為當(**)語句剛執行完后,另外一個使用本函數的進程可能正好被激活,那么當新激活的進程執行到此函數時,將使Exam賦與另一個不同的para值,所以當控制重新回到“temp = Square_Exam( )”后,計算出的temp很可能不是預想中的結果。此函數應如下改進。
unsigned int example( int para )
{
unsigned int temp;
[申請信號量操作] // 若申請不到“信號量”,說明另外的進程正處于
Exam = para; // 給Exam賦值并計算其平方過程中(即正在使用此
temp = Square_Exam( ); // 信號),本進程必須等待其釋放信號后,才可繼
[釋放信號量操作] // 續執行。若申請到信號,則可繼續執行,但其
// 它進程必須等待本進程釋放信號量后,才能再使
// 用本信號。
return temp;
}
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/