cpu對程式設計的影響

2021-07-23 21:14:48 字數 1307 閱讀 9873

由於cpu設計的不同,所以在cpu之間通訊的時候有些地方需要注意,常見的主要是位元組序和位元組對齊問題.

幾乎所有的機器上,多位元組物件都被儲存為連續的位元組序列。

現在有兩顆不同架構的cpu晶元, 分別是低有效位被優先儲存的cpu1(小端序)和高有效位被優先儲存的cpu2(大端序)

記憶體資料:

0x80480000

0x80480001

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。就是這一點點,坑了我一晚上,坑了師兄一上午。計算公式沒問題,求解程式沒問題,就是算出來的值有問題!後來才反應到是浮點數儲存造成的。舉乙個最簡單的浮點...