最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c++?對象分配在棧上還是在堆上問題分析

 更新時間:2023年11月02日 11:24:07   作者:點墨  
這篇文章主要為大家介紹了c++?對象在棧上還是在堆上問題分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

c++的對象到底在棧上還是分配在堆上?

首先,毋庸置疑,使用new和malloc系列函數(shù)分配的對象,一定是在堆上的。

Object *obj = new Object();

有爭議的是

Object obj;

它是在棧上還是在堆上呢?

要回答這個問題,首先我們需要理解這句話的意思,這句話并不代表在棧上分配內存,它代表的是讓obj具有“自動存儲(automatic storage)”的性質。所謂的“自動存儲”,意思是這個對象的存儲位置取決于其聲明所在的上下文。如果這個語句出現(xiàn)在函數(shù)內部,那么它就在棧上創(chuàng)建對象,此時obj變量和obj指代的對象(此時obj本質上其實是obj指代對象的首地址)都在棧上。

如果這個語句不是在函數(shù)內部,而是作為一個類的成員變量,則取決于這個類的對象是如何分配的??紤]下面的代碼:

class Test{
    Object obj;
}
Test *test = new Test;

test指針是在棧上,它所指代的對象Test是存在堆上,那么obj變量和obj對象就在堆上。

class Test{
    Object obj;
}
Test test;

test變量在棧上,test對象在棧上,那么obj變量和obj對象就在棧上。

遵循這么一個原則:

指針變量和普通變量由上下文定義,指針所指向的內存在堆上,普通變量所指代的對象由上下文定義。

棧大小

棧大小是有默認值的,如果申請的臨時變量太大就會超過棧大小,造成棧溢出。

它的默認值是可以修改的,一般,在unix-like平臺,棧的大小是由環(huán)境變量控制的,所以不能通過設置編譯器(像gcc)的任何編譯標志來設置;在windows平臺,棧的大小是包含在可執(zhí)行文件里的,它可以在visual c++的編譯過程中設置,但在gcc里是不可行的。

方法為:

項目->屬性->鏈接器->系統(tǒng)->堆棧保留大小 (字節(jié)數(shù))

在一般情況下,不同平臺默認棧大小如下所示(僅供參考)

SunOS/Solaris 8172K bytes (Shared Version)
Linux 10240K bytes
Windows 1024K bytes (Release Version)
AIX 65536K bytes

演示

??臻g

代碼

#include <iostream>
class Test {
public:
    Test() { std::cout << "Test" << std::endl; }
    ~Test() { std::cout << "~Test" << std::endl; }
private:
    char a[1024 * 1024];
};
class TestContainer {
public:
    TestContainer() { std::cout << "TestContainer" << std::endl; }
    ~TestContainer() { std::cout << "~TestContainer" << std::endl; }
private:
    Test test;
};
int main(int argc, char* argv[]) {
    TestContainer t;
    while (1) {}
    return 0;
}
  • 棧大小1MB(默認值),申請??臻g1MB

結果:程序崩潰,stack overflow

  • 棧大小1048577(1024*1024+1,即1MB多1B),申請??臻g1MB

結果:程序正常

堆空間

#include <iostream>
class Test {
public:
    Test() { std::cout << "Test" << std::endl; }
    ~Test() { std::cout << "~Test" << std::endl; }
private:
    char a[1024 * 1024];
};
class TestContainer {
public:
    TestContainer() { std::cout << "TestContainer" << std::endl; }
    ~TestContainer() { std::cout << "~TestContainer" << std::endl; }
private:
    Test test;
};
int main(int argc, char* argv[]) {
    TestContainer* t = new TestContainer;
    while (1) {}
    return 0;
}
  • 棧大小1MB,申請堆1MB
    結果:程序正常
  • 棧大小1MB,申請堆10MB
    結果:程序正常

以上就是c++ 對象分配在棧上還是在堆上問題分析的詳細內容,更多關于c++ 對象堆棧分配的資料請關注腳本之家其它相關文章!

相關文章

  • C語言用easyx實現(xiàn)消磚塊游戲

    C語言用easyx實現(xiàn)消磚塊游戲

    這篇文章主要為大家詳細介紹了C語言消磚塊游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • VS Code如何編寫C/C++程序的實現(xiàn)步驟

    VS Code如何編寫C/C++程序的實現(xiàn)步驟

    本文主要介紹了VS Code如何編寫C/C++程序的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C語言中各類指針的用法(小結)

    C語言中各類指針的用法(小結)

    這篇文章主要介紹了C語言中各類指針的用法(小結),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • C 語言基礎教程(我的C之旅開始了)[四]

    C 語言基礎教程(我的C之旅開始了)[四]

    C 語言基礎教程(我的C之旅開始了)[四]...
    2007-02-02
  • c++ TCHAR轉string導致中文缺失或亂碼問題及解決

    c++ TCHAR轉string導致中文缺失或亂碼問題及解決

    這篇文章主要介紹了c++ TCHAR轉string導致中文缺失或亂碼問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • OJ中G++和C++的區(qū)別

    OJ中G++和C++的區(qū)別

    今天小編就為大家分享一篇關于OJ中G++和C++的區(qū)別,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • C++編程中的函數(shù)指針初步解析

    C++編程中的函數(shù)指針初步解析

    這篇文章主要介紹了C++編程中的函數(shù)指針初步解析,函數(shù)指針在C語言和C++學習中都是非常重要的知識,需要的朋友可以參考下
    2016-04-04
  • c/c++中的左值右值詳解

    c/c++中的左值右值詳解

    這篇文章主要介紹了c/c++中的左值右值,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • C語言 位段的詳細介紹

    C語言 位段的詳細介紹

    這篇文章主要介紹了C語言 位段的詳細介紹的相關資料,學習C語言基礎的朋友,可以參考本文,需要的朋友可以參考下
    2016-11-11
  • 深入解析C++中的智能指針

    深入解析C++中的智能指針

    本文介紹了C++中RAII機制和智能指針的概念、使用及實現(xiàn)原理,本文結合實例代碼給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2025-10-10

最新評論

东兰县| 鲜城| 涪陵区| 宁海县| 民权县| 常德市| 邓州市| 舟山市| 赤壁市| 泊头市| 永德县| 贡嘎县| 惠东县| 桐柏县| 涞水县| 抚顺市| 扎囊县| 蒙阴县| 乌兰浩特市| 太谷县| 海安县| 古浪县| 工布江达县| 贺兰县| 保山市| 新津县| 凤城市| 堆龙德庆县| 固始县| 晋州市| 江达县| 柘城县| 牙克石市| 六枝特区| 新巴尔虎右旗| 乌海市| 东丽区| 咸宁市| 石楼县| 宁都县| 株洲市|