欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c++?對(duì)象分配在棧上還是在堆上問(wèn)題分析

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

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

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

Object *obj = new Object();

有爭(zhēng)議的是

Object obj;

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

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

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

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

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

class Test{
    Object obj;
}
Test test;

test變量在棧上,test對(duì)象在棧上,那么obj變量和obj對(duì)象就在棧上。

遵循這么一個(gè)原則:

指針變量和普通變量由上下文定義,指針?biāo)赶虻膬?nèi)存在堆上,普通變量所指代的對(duì)象由上下文定義。

棧大小

棧大小是有默認(rèn)值的,如果申請(qǐng)的臨時(shí)變量太大就會(huì)超過(guò)棧大小,造成棧溢出。

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

方法為:

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

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

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(默認(rèn)值),申請(qǐng)??臻g1MB

結(jié)果:程序崩潰,stack overflow

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

結(jié)果:程序正常

堆空間

#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,申請(qǐng)堆1MB
    結(jié)果:程序正常
  • 棧大小1MB,申請(qǐng)堆10MB
    結(jié)果:程序正常

以上就是c++ 對(duì)象分配在棧上還是在堆上問(wèn)題分析的詳細(xì)內(nèi)容,更多關(guān)于c++ 對(duì)象堆棧分配的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • c++11新增的便利算法實(shí)例分析

    c++11新增的便利算法實(shí)例分析

    這篇文章主要介紹了c++11新增的便利算法,主要有用于判斷、查找、數(shù)組、序列等的操作算法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2014-09-09
  • C++中overload,override,overwrite的區(qū)別詳細(xì)解析

    C++中overload,override,overwrite的區(qū)別詳細(xì)解析

    以下是對(duì)C++中overload,override,overwrite的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-09-09
  • 簡(jiǎn)介C++編程中的運(yùn)算符重載

    簡(jiǎn)介C++編程中的運(yùn)算符重載

    這篇文章簡(jiǎn)單介紹了C++編程中的運(yùn)算符重載,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • 純C語(yǔ)言實(shí)現(xiàn)火車售票系統(tǒng)

    純C語(yǔ)言實(shí)現(xiàn)火車售票系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了純C語(yǔ)言實(shí)現(xiàn)火車售票系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C語(yǔ)言學(xué)生成績(jī)管理系統(tǒng)設(shè)計(jì)

    C語(yǔ)言學(xué)生成績(jī)管理系統(tǒng)設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言學(xué)生成績(jī)管理系統(tǒng)設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C語(yǔ)言求解無(wú)向圖頂點(diǎn)之間的所有最短路徑

    C語(yǔ)言求解無(wú)向圖頂點(diǎn)之間的所有最短路徑

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言求解無(wú)向圖頂點(diǎn)之間的所有最短路徑,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • MFC實(shí)現(xiàn)簡(jiǎn)單計(jì)算器

    MFC實(shí)現(xiàn)簡(jiǎn)單計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了MFC實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 詳解C++11中綁定器bind的原理與使用

    詳解C++11中綁定器bind的原理與使用

    C++11中引入的function機(jī)制,其中綁定器主要有三種:bind1st、bind2nd、bind(C++11)。本文就來(lái)和大家聊聊這些綁定器的底層實(shí)現(xiàn)原理與使用場(chǎng)景,需要的可以參考一下
    2022-12-12
  • C/C++中#define的妙用分享

    C/C++中#define的妙用分享

    本文主要介紹了C++/C關(guān)于#define的一些妙用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • C++類和對(duì)象補(bǔ)充

    C++類和對(duì)象補(bǔ)充

    類是創(chuàng)建對(duì)象的模板,一個(gè)類可以創(chuàng)建多個(gè)對(duì)象,每個(gè)對(duì)象都是類類型的一個(gè)變量;創(chuàng)建對(duì)象的過(guò)程也叫類的實(shí)例化。每個(gè)對(duì)象都是類的一個(gè)具體實(shí)例(Instance),擁有類的成員變量和成員函數(shù)
    2021-10-10

最新評(píng)論