2017-06-11 205 views
-2

內存我有一個疑問,因爲我們知道,指針是存儲地址的變量。 我可以存儲一個值在使用儘量減少使用

cin>>(*p); 

,而無需使用任何其他正常可變該地址。 下面的代碼解釋一樣:

#include'iostream' 
int main() 
{ 
    long long *p; 
    cin>>(*p); 
    cout<<(*p); 
    return 0; 
} 

它是正確的,這樣的店變量?

如果我們可以存儲這樣的值,那麼我們就可以節省這麼多的內存,因爲我們只指針變量必須分配內存。這遠遠小於普通長長數據類型的大小。

+2

你對指針的理解非常誤導。花一個星期的時間閱讀好幾本好書。在實踐中,你有很多內存。重點不在於保存它,而是要明智地使用它。 –

+0

使用指針實際上使用*以上*因爲所需'長long'(通常8個字節)*和*的值的指針(通常4或8個字節)的空間的存儲器 – vu1p3n0x

+0

這種編碼的不保存內存,通常會使代碼變得更糟,而且會浪費時間。 – user3344003

回答

2

指針具有一個未定義的值,因此,任何試圖在該地址寫入將導致未定義的行爲。

更好:

int main() 
{ 
    long long *p = new long long(); // heap allocation 
    cin>>(*p); 
    cout<<(*p); 
    delete p; 
    return 0; 
} 

OR

int main() 
{ 
    long long p; // stack variable 
    cin>>p; 
    cout<<p; 
    return 0; 
} 
+4

使用'new'只在某種意義上更好至少它不是UB,但是我不會向那些顯然是一個完全初學者的人推薦。 –

2

hope this explains better 希望這幅畫解釋更好。

左列使用以下代碼:

int main() { 
    long long p; 
    std::cin >> p; 
    std::cout << p; 
} 

使用long long p來存儲數據,其分配八個字節空間p並且該程序結束時釋放該存儲器。

右列將使用您的代碼(I製成的比特變化的/)

int main() { 
    long long *p = new long long(); 
    std::cin >> *p; 
    std::cout << *p; 
    delete p; 
} 

它分配4個字節爲指針32位機器上,或8個字節爲指針64位機器上。當你使用一個指針時,必須爲它分配一個內存位置來存儲數據,所以它將在長堆中爲堆分配另外8個字節的內存。所以後者使用更多的內存。

爲了更好的存儲效率,你應該堅持long long p,避免指針,加上分配和指針釋放內存是慢的東西。

+1

此外,你不能忘記'刪除',否則內存將泄漏。更好的是,使用智能指針。更好的是,不要亂指針。 –