關於CSAPP讀到的一些(1)——Alignment(出自Machine-Level Representation of Program)

來源:互聯網
上載者:User

話說從來沒有考慮過變數定義的順序會給程式運行時候的效率造成多大的影響。原來一直都比較天真,暑假開始看了CSAPP,類似於電腦體繫結構,但是是從編程的角度來寫的,現在還在和影印版死磕中,用了一個多禮拜的時間總算讀完了Machine-Level Representation of Program這一章,腦袋裡面只剩下。。。GCC。。。和組合語言。。。汗。。不過編譯器真的很強大,直接造成我們只管寫代碼,不管底層的操作之類的習慣。

今天讀到data alignment的時候才發現,原來。。在struct裡面定義不同變數的時候往往順序的不同,造成的記憶體配置也是不一樣的,內部各個變數的位移位置也是不同的。此處,linux和windows的規定又是不一樣的。

之所以會有對齊限制(Limit Alignment)完全是為了簡化儲存和CPU之間的硬體介面的設計難度。

linux下,小類型的alignment為2的倍數,即short之類的類型,位移位置必須得從2的倍數大小開始,而其他的大類型變數的位移位置需要從4的倍數開始位移。例如:

struct MixedData{    int Data1;          short Data2;    int Data3;};

Data1的位移量為0,Data2的位移量為4,Data3的位移量就為8。gcc在翻譯這段代碼的時候會自己在Data2和Data3之間插入2Byte的空間以達到linux的位移限制。而若將此結構體定義為

struct MixedData{    int Data1;    int Data3;    short Data2;};

則分配的記憶體空間和前一個結構體就是完全不一樣的。

在windows下面這種限制更為嚴格。基本是按照若一個類型的大小是M Byte,那麼該類型變數在結構體中的位移量只能是M的倍數,即N*M的位移位置。所以win下結構體中定義的變數順序會導致的記憶體浪費比較多。

嗯。。其實這一章還有比較重要的地方在於遞迴調用的時候系統各個處理器的處理情況其組合語言的寫法。。。但是這個比較常見了。。。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.