[英]C++ cast memory allocation
我想知道以下操作是否會導致內存分配:
int x = 0;
long long y = x + 1;
如果是這樣,是否有任何編譯器優化可以即時解決這一問題,或者是否導致了獨立的強制轉換,然后進行了添加?
答案是:這取決於。 如果程序的行為不依賴於它,則絕對不需要編譯器執行內存分配。 特別是C ++ 14 n3797 S1.9:
本國際標准中的語義描述定義了參數化的不確定性抽象機器。 本國際標准對一致性實現的結構沒有要求。 特別是,它們不需要復制或模擬抽象機的結構。 相反,需要遵循的實現來(僅)模擬抽象機的可觀察行為,如下所述。
該規定有時被稱為“假設”規則,因為只要可以從可觀察到的行為中確定結果,就可以無視本國際標准的任何要求,而該實現可以自由地執行。該程序。 例如,如果實際實現可以推斷出未使用其值並且不會產生影響程序可觀察行為的副作用,則無需評估表達式的一部分。
在這種情況下:
long long f() {
int x = 0;
long long y = x + 1;
return y;
}
編譯器絕對可以將函數重寫為:
long long f() {
return 1;
}
這樣做可能只是將立即值加載到寄存器中,而根本不會執行任何內存訪問。 根據調用上下文的不同,它甚至可以內聯此函數,以便它完全從視圖中消失。
如果變量是函數內部的局部變量,則編譯器將確保堆棧上有足夠的空間供它們使用。 如果它們是全局變量,則在可執行文件中將為變量保留空間,並且將由操作系統的運行時加載器對其進行“分配”。
沒有正在進行的動態內存分配,即堆上沒有任何分配。 該空間由編譯器保留,因此它已經由編譯器“即時”處理。
我不知道我是否完全理解您的問題,但我會盡力提供2美分。 如果您不知道,初始化的方式不是最有效的方法。 例如:
int x = 0;
正在調用默認的int構造函數,該構造函數使用默認的分配器-在數據段中保留內存-然后將默認的int值放入0,然后使用賦值運算符-使用復制的構造函數-依次調用析構函數對於第一個int x
,然后最終int x = 0;
。 換句話說int x(0);
更好,盡管對int並不重要。 編譯器也會為您優化此過程,我只是指出這一點是為了幫助您以編程風格做出決策。
long long y = x + 1;
調用了類似的構造函數調用和復制構造函數,但是加法部分微不足道。
我認為您的問題實際上是是否構造了一個臨時變量,將x
的值保留得很long long
以便可以將其加到1。
答案是不。 1
和x
均為int
類型,因此該算術將作為int
算術執行,然后將結果轉換為long long
並存儲在y
。
如果要在long long
將x
添加到其他類型的對象上long long
那么可以,在進行算術運算之前, x
將被強制轉換為long long
時間。 通常,對編譯器如何處理這種情況沒有要求,但是實際上,在您可能會遇到的幾乎任何體系結構上,它都會發生在CPU寄存器中,而不是內存中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.