0

我看過代碼,其中帶有register關鍵字的變量通過引用傳遞給函數。通過引用傳遞一個寄存器變量

版本1:

inline static void swap(register int &a, register int &b) 
{ 
    register int t = a; 
    a = b; 
    b = t; 
} 

版本2:

inline static void swap(register int a, register int b) 
{ 
    register int t = a; 
    a = b; 
    b = t; 
} 

什麼是兩個版本之間的差異?

據我瞭解,一個b保持在寄存器因此參考運營商不應該有任何的效果在這些寄存器中的值所做的更改應在整個主叫 - 被叫邊界仍然存在,而無需使用參考運算符。

+4

「register」關鍵字已棄用。無論是否存在,99%都不會有什麼區別。 – chris

+0

引用轉換爲機器代碼級地址,它可以防止將變量映射到除可能用於PDP-11以外的寄存器,對此,AFAIK不存在C++編譯器。 –

+0

@Alf不,PDP-11也沒有寄存器地址。 – EJP

回答

4

在C程序中,不能取寄存器變量的地址。

register int x; 
int * p = &x; // Compiler error 

這在宏中有時很有用,它可以防止客戶端獲取只應該用作值的地址。

使用寄存器在C++ 11標準中已被棄用(請參見[depr.register])。在C++中,採用寄存器變量的地址是合法的,但是在C++ 11標準的最新版本中聲明具有alignas的寄存器變量的對齊方式是不合法的。 See 7.6.2 Alignment specifier

除了防止使用alignas()並在本地使用外部時引起語法錯誤,寄存器在C++中不做任何事情。既然它已經被棄用了,並且因爲我無法想象任何你想要防止宏內部使用的變量對齊的原因,你應該避免在C++代碼中使用寄存器。

要回答這個問題:在C++中,您的代碼和寄存器刪除後的等效代碼沒有區別,因此您的「兩個版本」以不同的方式顯而易見。

-1

對於C++程序,計算機的內存就像一系列的存儲單元,每個存儲單元的大小都是一個字節,每個存儲單元都有一個唯一的地址。這些單字節存儲單元的排列方式允許大於一個字節的數據表示佔用具有連續地址的存儲單元。

這樣,每個單元格都可以通過其唯一地址輕鬆地定位到內存中。例如,地址爲1776的存儲單元總是緊跟在地址1775之後的單元之後並且在1777之前,並且恰好在776之後的一千個單元以及在2776之前的恰好一千個單元。

當變量是聲明,存儲其值所需的內存將分配給內存中的特定位置(其內存地址)。通常,C++程序不主動決定其變量存儲位置的確切內存地址。幸運的是,這個任務留給程序運行的環境 - 通常是一個在運行時決定特定內存位置的操作系統。但是,程序可以在運行時獲取變量的地址,以便訪問與其相關的特定位置的數據單元可能很有用。