IA 64 對結構體中的字段進行原子操作注意問題

2021-06-20 19:40:58 字數 537 閱讀 6648

先看以下**:

#include #pragma pack(1)

struct test

;#pragma pack()

int main()

以上**在ia-64 linux平台上面編譯執行,將會出現:

1: (11007): unaligned access to 0x60000fffffb7f5fc, ip=0x4000000000000791

2: 匯流排錯誤

原因分析:

1) 由於ia-64平台是以8位元組對齊的,不是8位元組對齊的記憶體訪問方式的話將會出現unaligned access錯誤.

2) 匯流排錯誤是在呼叫__sync_fetch_and_add時出現的.原因也是跟位元組對齊有關.(具體原因可能是跟ia-64架構的暫存器是64位的有關)

所以在ia-64平台上編譯,並且對結構體中某個欄位做原子操作的話,需要注意一下結構體欄位定義的順序.

上述test結構體只要把a和b的定義順序調整一下,就可以正常執行了.

go根據結構體中任意字段進行排序

package main import fmt sort type student struct type bynumber student func this bynumber len int func this bynumber less i,j int bool func this bynum...

47 對檔案中的結構體陣列進行排序

程式通過定義學生結構體變數,儲存了學生的學號 姓名和3門課的成績,所有學生資料均以二進位制方式輸出到檔案中。函式fun的功能是從形參filename所指的檔案中讀取學生資料,並按照學號從小到大排序後,再用二進位制方式白排序後的學生資料輸出到filename所指的檔案中覆蓋原來的內容。include ...

golang反射還原結構體中的字段

假設有這樣乙個結構體 type s struct a s 3.14 用反射可以輕鬆拿到每個欄位的值 reflect.valueof a fieldbyname a reflect.valueof a fieldbyname b reflect.valueof a fieldbyname c 但這樣返...