所以我相信在 64 位系統上,指標是 8B。一個浮點數是 4B。假設您有以下代碼:
const float a = 1.0f;
然后,我想知道以下的成本比較。說我們有
const float b = a;
我知道復制float將是4B。但我認為如果我們不必復制float. 我知道如果不是float,而是一個大物件(> 8B),以類似的方式使用參考會更優化:
const float &b = a;
但是,既然我們使用的是浮點數,那么復制到一個新變數是否更緊湊?假設編譯器不會優化任何東西?
const float a = b;
const float &a = b;
uj5u.com熱心網友回復:
如果您寫const float b = a;,那么您正在制作該值的副本。現在,如果該型別是基本型別或可簡單復制而沒有自定義復制建構式,則編譯器可以輕松優化復制,并且根本不會生成實際代碼。除非您獲取物件的地址:
#include <iostream>
int main() {
const float a = 1.0;
const float b = a;
const float &r = a;
std::cout << "&a == &b: " << (&a == &b ? "true" : "false") << std::endl;
std::cout << "&a == &r: " << (&a == &r ? "true" : "false") << std::endl;
}
給出:
&a == &b: false
&a == &r: true
如您所見a,b地址不同。它們是不同的物件,編譯器必須添加anamed的副本b。r另一方面,參考是同一個物件,a因此它具有相同的地址。編譯器不會復制。
如果a不是普通型別并且編譯器無法消除復制建構式,這也成立。參考是一個總的 NOP,它只是給現有物件另一個名稱。
但不要將此與通過參考傳遞值或將參考存盤在結構或類中相混淆。在內部,參考被實作為指標。如果傳遞參考,則傳遞指標的副本。如果存盤參考,則存盤指標。
只有對于區域參考,編譯器才能直接使用原始物件。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/493797.html
標籤:C
上一篇:有沒有一種方法可以讓#define普通文字作為C 的基本運算子?
下一篇:具有多個物件的C 陣列
