当前位置:  开发笔记 > 编程语言 > 正文

如何识别对象是否应该在堆栈中?

如何解决《如何识别对象是否应该在堆栈中?》经验,为你挑选了1个好方法。

我一直在寻找在C++中在堆栈或堆上分配对象的经验法则.我在这里找到了许多关于SO的讨论.很多人说,这是关于物体的寿命.如果您需要比函数范围更长的生命周期,请将其放入堆中.这很有道理.

但令我困惑的是,许多人说,如果它们很小,就会将对象分配给堆栈.如果对象很大,请将其放入堆中.但他们都没有说如何识别物体是否很大?

我有以下问题,

    如何识别对象是否很大?

    堆栈最大大小是多少?每个OS都有不同的堆栈大小?

    我有一个包装的包装类vector.它将有大约100件物品.如果我将这个类分配给堆栈,它是否会导致堆栈溢出?我试过这个,但效果很好.不确定我做错了什么.

Andrew Grant.. 10

首先,向量(以及所有STL容器类)总是从堆中分配,因此您不必担心这一点.对于任何具有可变大小的容器,使用堆栈几乎是不可能的.

如果你考虑堆栈分配是如何工作的(在编译时,基本上通过递增每个对象的指针),那么应该清楚向量内存来自堆.

std::vector myInts;
std::string myString;
SomeOther Class;

// this memory must come from the heap, there's no way it
// can now be allocated on the stack since there are other
// objects and these parameters could be variable
myString = "Some String";
myInts.reserve(256);

除非您处于递归函数中,否则可以在堆栈上放置几千字节的数据而不必担心.堆栈大小由程序(不是OS)控制,默认值范围为32kb - 1mb.大多数桌面软件都在1mb范围内.

单个对象几乎从不关注.通常,它们要么足够小,要么堆栈,或者从堆内部分配.

如果对象是函数的本地对象,则将它们放在堆栈中.如果不把它们放在堆上.

将堆用于分配用于加载/排序/操作数据的大缓冲区.



1> Andrew Grant..:

首先,向量(以及所有STL容器类)总是从堆中分配,因此您不必担心这一点.对于任何具有可变大小的容器,使用堆栈几乎是不可能的.

如果你考虑堆栈分配是如何工作的(在编译时,基本上通过递增每个对象的指针),那么应该清楚向量内存来自堆.

std::vector myInts;
std::string myString;
SomeOther Class;

// this memory must come from the heap, there's no way it
// can now be allocated on the stack since there are other
// objects and these parameters could be variable
myString = "Some String";
myInts.reserve(256);

除非您处于递归函数中,否则可以在堆栈上放置几千字节的数据而不必担心.堆栈大小由程序(不是OS)控制,默认值范围为32kb - 1mb.大多数桌面软件都在1mb范围内.

单个对象几乎从不关注.通常,它们要么足够小,要么堆栈,或者从堆内部分配.

如果对象是函数的本地对象,则将它们放在堆栈中.如果不把它们放在堆上.

将堆用于分配用于加载/排序/操作数据的大缓冲区.

推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有