由於cpu設計的不同,所以在cpu之間通訊的時候有些地方需要注意,常見的主要是位元組序和位元組對齊問題.
幾乎所有的機器上,多位元組物件都被儲存為連續的位元組序列。現在有兩顆不同架構的cpu晶元, 分別是低有效位被優先儲存的cpu1(小端序)和高有效位被優先儲存的cpu2(大端序)
記憶體資料:
0x804800000x80480001
0x80480002
0x80480003
0x12
0x34
0x56
0x78
從記憶體位址0x80480000讀取乙個位元組時,cpu1和cpu2讀取的結果都是0x12;
從記憶體位址0x80480000讀取兩個位元組時,cpu1讀取的結果是0x3412,而cpu2讀取的結果是0x1234;
這樣就產生了所謂的位元組序問題,只有讀取大於2個位元組的時候才會涉及位元組序的問題。
//簡單判斷當前機器的位元組序
int main(void)
1. 基本資料型別的自身對齊值char --> 1
short --> 2
int, float, long --> 4
double, long long --> 8
2. 結構體或者類的自身對齊值:
其資料成員中自身對齊值最大的那個值。
3. 資料成員、結構體和類的有效對齊值:
自身對齊值和指定對齊值中小的那個值。
4. 指定對齊值:
#pragma pack (2) /* 指定按2位元組對齊 */
/* 結構體定義 */
struct c ;
#pragma pack () /* 取消指定對齊,恢復預設對齊 */
說明:
* 有效對齊值很重要,是最終用來決定資料存放位址方式的值。有效對齊值為n就表示該資料的存放起始位址%n=0。* 對齊後的長度必須是成員中最大的對齊引數的整數倍,這樣在處理陣列時可以保證每一項都邊界對齊//補齊
* 對於陣列,比如:char a[3];它的對齊方式和分別寫3個char是一樣的.也就是說它還是按1個位元組對齊.
* 如果寫: typedef char array3[3];array3這種型別的對齊方式還是按1個位元組對齊,而不是按它的長度.
* 不論型別是什麼,對齊的邊界一定是1,2,4,8,16,32,64….中的乙個
現代cpu的合併寫技術對程式的影響
對於現代cpu而言,效能瓶頸則是對於記憶體的訪問。cpu的速度往往都比主存的高至少兩個數量級。因此cpu都引入了l1 cache與l2 cache,更加高階的cpu還加入了l3 cache.很顯然,這個技術引起了下乙個問題 如果乙個cpu在執行的時候需要訪問的記憶體都不在cache中,cpu必須要通...
打字速度對程式設計的影響大嗎?
打字速度對程式設計影響不大。就算不論 打字速度 和 思考速度 的比較以及 大牛憋三分鐘寫十行 好過新手狂敲十分鐘 這些因人而異的東西,在ide環境中,如果你追求最高輸入效率,其實應該是充分利用 補全和重構功能,你連續輸入大段文字的機會根本就不多。況且為了準確性,就算我打字速度足夠快,我也會優先選擇複...
浮點數精度對程式設計使用的影響
浮點數在計算機程式設計中一定會使用,然而使用中會有很多坑。最近做機械臂就被跳到坑里了。機械臂三自由度反解出來的cos值比1大一點點,1.00000.4。就是這一點點,坑了我一晚上,坑了師兄一上午。計算公式沒問題,求解程式沒問題,就是算出來的值有問題!後來才反應到是浮點數儲存造成的。舉乙個最簡單的浮點...