c語言中的register修飾符

來源:互聯網
上載者:User

register修飾符暗示編譯器相應的變數將被頻繁地使用,如果可能的話,應將其儲存在CPU的寄存器中,以加快其儲存速度。例如下面的記憶體塊拷貝代碼,
  
  
  #ifdef NOSTRUCTASSIGN
  memcpy (d, s, l)
  {register char *d;
  register char *s;
  register int i;
  while (i--) 
  *d++ = *s++;
  }
  #endif
  但是使用register修飾符有幾點限制。
  首先,register變數必須是能被CPU所接受的類型。這通常意味著register變數必須是一個單個的值,並且長度應該小於或者等於整型的長度。不過,有些機器的寄存器也能存放浮點數。
  其次,因為register變數可能不存放在記憶體中,所以不能用“&”來擷取register變數的地址。
  由於寄存器的數量有限,而且某些寄存器只能接受特定類型的資料(如指標和浮點數),因此真正起作用的register修飾符的數目和類型都依賴於運行程式的機器,而任何多餘的register修飾符都將被編譯器所忽略。
  在某些情況下,把變數儲存在寄存器中反而會降低程式的運行速度。因為被佔用的寄存器不能再用於其它目的;或者變數被使用的次數不夠多,不足以裝入和儲存變數所帶來的額外開銷。
  早期的C編譯器不會把變數儲存在寄存器中,除非你命令它這樣做,這時register修飾符是C語言的一種很有價值的補充。然而,隨著編譯器設計技術的進步,在決定那些變數應該被存到寄存器中時,現在的C編譯環境能比程式員做出更好的決定。實際上,許多編譯器都會忽略register修飾符,因為儘管它完全合法,但它僅僅是暗示而不是命令。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.