簡體   English   中英

C++ 內存,分配

[英]C++ memory, allocation

由於首尾地址相同或&pi和a中的地址相同,a中的地址是來自常量數據段還是空閑存儲區?

int main() 
{
    const int pi = 10;

    cout <<"This is constant memory area's address " << &pi << endl; 

    int *a = new int;

    cout << "This is free store memory area's address " << a << endl;

    a = (int*) &pi;
    cout << *a << endl;
    cout << "This is free store memory area's address " <<a << endl;

    return 0; 
}   

你的概念不正確。 您的程序存在副作用或限制。

該聲明:
const int pi = 10;

聲明一個常量。 編譯器可以將常量放在任何它想要的地方。
以下是一些可能的位置:

  1. 直接進入處理器的指令(當使用該值時)。
  2. 編譯器可以將值放入可執行部分的數據區中。
  3. 在寄存器中(寄存器通常不可尋址,沒有地址)。
  4. 在程序的常量數據區中。
  5. 堆。
  6. 堆棧。
  7. 全局變量區。

但是,在您獲取常量地址的那一刻,編譯器無法將值存儲在以下位置:

  1. 寄存器(寄存器不能被指針訪問)。
  2. 在可執行指令中,例如move reg_a, #10

此外,指針也可以存在於寄存器中。 但是,獲取指針的地址可以防止指針存在於寄存器中,因為使用&運算符要求變量存在於可尋址的內存位置中,而寄存器不能通過指針尋址。

順便說一句,你有內存泄漏:

a = new int;
a = &pi;

最后一條語句丟失或泄漏了動態分配的整數的位置。

注意:有些處理器中的寄存器位於內存中的可尋址位置; 但這些都是例外。

編輯 1:符號表
當你將一個變量聲明為const並為其賦值時,編譯器可以將該變量存儲在一個 <symbol, value> 表中,而不占用程序中的任何變量空間。

當編譯器遇到符號時,例如pi ,它可以在其表中查找符號pi並替換值 (10)。 所以表達式:
int b = pi;
替換后會變成:
int b = 10;
因此,您的pi變量在您的程序中沒有任何分配的空間。 在上面的例子中,變量的被放入你的程序中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM