Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这个嵌套数组使用堆栈还是堆内存?_C++ - Fatal编程技术网

C++ 这个嵌套数组使用堆栈还是堆内存?

C++ 这个嵌套数组使用堆栈还是堆内存?,c++,C++,假设我在向量中嵌套了数组的声明和用法 const int MAX_LEN = 1024; typedef std::tr1::array<char, MAX_LEN> Sentence; typedef std::vector<Sentence> Paragraph; Paragraph para(256); std::vector<Paragraph> book(2000); const int MAX\u LEN=1024; typedef std::

假设我在向量中嵌套了数组的声明和用法

const int MAX_LEN = 1024;
typedef std::tr1::array<char, MAX_LEN> Sentence;
typedef std::vector<Sentence> Paragraph;

Paragraph para(256);
std::vector<Paragraph> book(2000);
const int MAX\u LEN=1024;
typedef std::tr1::数组语句;
typedef std::向量段落;
第(256)段;
std::矢量书(2000年);
我假设
语句
的内存在堆栈上。
是这样吗? 矢量
para
的内存如何?这是否在堆栈上,即如果我的para太大,我应该担心吗
最后,关于这本书的记忆呢?我想那必须在堆上,但是嵌套数组在堆栈上,不是吗?
其他问题
段落的内存是否连续?
book
的内存是否连续?

没有堆栈。不要想一堆。重要的是给定的容器类是否执行任何动态分配

std::array
不使用任何动态分配,它是自动分配的
t[N]
的包装器

但是,放入向量中的任何内容都将由向量自己的分配器分配,在默认情况下(通常)使用
::operator new()
执行动态分配

因此,简而言之,
vector
vector
非常相似:分配器只需为
数组
(或
int
)的任意多个单元分配内存,以容纳和构造该内存中的元素。冲洗并重复嵌套向量


对于您的“附加问题”:
vector
对于
T
绝对不是连续的。它仅与
向量
相邻,但只包含内部向量的小簿记部分。内部向量的实际内容由内部向量的分配器分配,并分别分配给每个内部向量。通常,
vector
对于类型
S
来说是连续的,没有其他内容

实际上,我不确定向量是否是连续的,因为数组除了包含的
U[N]
,没有理由包含任何数据,但我不确定这是否是必需的


你可能想单独问这个问题,这是个好问题

作为旁注,使用它可能会有所帮助。它允许您手动检查内存,包括变量的位置。您可以精确地检查自己正在使用的内存。

您的代码示例:

const int MAX_LEN = 1024;
typedef std::tr1::array<char, MAX_LEN> Sentence;
typedef std::vector<Sentence> Paragraph;

Paragraph para(256);
std::vector<Paragraph> book(2000);
const int MAX\u LEN=1024;
typedef std::tr1::数组语句;
typedef std::向量段落;
第(256)段;
std::矢量书(2000年);
“我假设句子的内存在堆栈上。对吗?” 否。是否在堆栈上分配了内容取决于声明上下文。你省略了上下文,因此什么也说不出来。如果一个对象是局部的、非静态的,那么您可以为该对象本身获得堆栈分配,但不一定为其内部引用的部分获得堆栈分配。顺便说一下,因为这里的另一个答案是“没有栈”,只是忽略了关于C++必须支持哪些系统的城市传说。它最初源于对一台相当不成功的硬件级优化计算机如何工作的误解,一些人错误地认为它没有一个简单的硬件支持的数组,比如堆栈实现。从“不简单”到“不存在”是相当长的一段时间,甚至“不简单”也是完全错误的,不仅在事实上,而且在逻辑上(最终是自相矛盾)。也就是说,这是一个不太聪明的初学者的错误,尽管至少有一个有经验的人传播了这个神话。不管怎样,C++保证了一个抽象的堆栈,并且在所有现存的保证抽象堆栈的计算机上都是用一个硬件辅助数组来实现的,比如简单的堆栈

“向量para的内存如何?它在堆栈上吗” 同样,这取决于您没有显示的声明上下文。同样,即使对象本身在堆栈上分配,它内部引用的部分也不会(通常)在堆栈上分配

“也就是说,如果我的para太大,我应该担心吗?” 不,没必要担心。std::vector
动态分配其缓冲区。它不受可用堆栈空间的限制

“最后,书本的内存呢?我想它必须在堆上,但是嵌套数组在堆栈上,不是吗?” 不,不

“段落的内存是否连续?” 没有。但是向量的缓冲区是连续的。这是因为
std::array
保证连续,而
std::vector
的缓冲区保证连续

“书本的内存是连续的吗?”
NO.</P> - 1“没有堆栈”是错误的(关于C++系统必须支持什么的城市神话)。请不要传播愚蠢的城市神话。这使得初学者很难理解标准,例如“堆栈展开”——如果没有,展开就有点困难。@Alf:我认为标准在那里的措辞很糟糕。它不是真正的“堆栈展开”,而是“范围展开”,我们只是使用这个术语,因为它使初学者很容易摸索。正如在技术上没有对堆栈的要求一样,它只是最简单的方法(实际上是实际的实现方法)(虽然它可以用其他方式来完成(历史和60个版本的俄语编译器)已经显示(它们生成了自修改代码))堆栈的概念不利于初学者理解C++。(我个人认为这会让问题变得更难)特别是对于这个问题的答案。从自动和动态存储持续时间对象和范围的角度来解释这个问题要容易得多。这也是从标准的角度来解释的正确方法。所以我不得不同意:比如“没有勺子”这只是一个简单的方式来感知某些浓度