Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >标准如何保证数据结构使用连续内存?

标准如何保证数据结构使用连续内存?
EN

Stack Overflow用户
提问于 2009-07-25 19:06:11
回答 3查看 879关注 0票数 2

我只是想知道内存到底是如何工作的,以至于语言标准(如C++的ISO/ANSI标准)可以保证任何数据结构(即使是数组)都是连续的。

我甚至不知道如何使用上下文内存编写数据结构,但您能给我一个简短的例子来说明设计师如何做到这一点吗?

例如,假设来自C++的std::vector在运行时分配了所有内存,它如何知道当前分配的内存之前的内存插槽没有在使用(因此,向量可以使用空闲的内存)?向量只是看得很远,并希望用户不要尝试和push_back太多的对象,以至于不能再将其存储在连续的内存块中?或者操作系统会随意移动内存,以防止这成为问题(不知道这是如何工作的)?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-07-25 20:06:33

您的问题似乎是关于如何从初学者的角度理解内存分配的概念。让我试着以一种非常简单的方式来解释正在发生的事情。作为一个例子,我们可以考虑向std::vector添加大量元素的C++程序。

当程序启动时,C++运行时将调用操作系统来分配一些内存。这块内存称为堆,在C++程序需要动态内存时使用。最初,堆大部分是未使用的,但对newmalloc的调用将在堆上划分出内存块。在内部,堆使用一些记账信息来跟踪堆的已用区域和空闲区域。

std::vector在内部的具体行为取决于实现,但通常它会为堆上的向量元素分配一个缓冲区。这个缓冲区足够大,可以容纳向量中的所有元素,但大多数情况下,它的末尾有一些空闲空间。这是一个存储5个元素的缓冲区,有足够的空间容纳8个元素。缓冲区位于堆上的地址1000处。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1000: X X X X X _ _ _

std::vector跟踪向量(5)中元素的数量以及缓冲区的大小(8)和位置(1000)。

下面是调用push_back向向量添加新元素后的缓冲区:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1000: X X X X X X _ _

这可以再做两次,直到缓冲区中的所有空间都用完为止。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1000: X X X X X X X X

但是如果再次调用push_back会发生什么呢?向量必须增加缓冲区的大小。缓冲区是在堆上分配的,如果缓冲区后面的区域未被使用,则实际上可以简单地增加缓冲区。然而,在大多数情况下,内存已经被分配给了其他对象。这是堆跟踪的东西。为了使向量能够增长缓冲区,它必须分配一个大小增加的全新缓冲区。许多实现都会简单地将缓冲区的大小加倍。下面是新的buffer,它现在存储了9个元素,并有16个元素的空间。新的缓冲区被分配到堆上的地址2000:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2000: X X X X X X X X X _ _ _ _ _ _ _

旧缓冲区的内容被复制到新缓冲区,如果缓冲区很大,则此操作的开销可能会很大。

如果您想知道,当程序运行时,堆也可能增长,就像在堆上分配的单个块可能增长一样。这将增加程序的内存消耗。随着越来越多的元素被添加到向量中,堆将不得不增长,直到操作系统拒绝增加堆的大小。当发生这种情况时,程序将失败,并出现内存不足的情况。

总结一下:

  • 操作系统为堆提供内存,该内存的大小可以增长,直到达到操作系统的限制为止。
  • C++中的内存分配例程可以分配和释放堆上固定大小的块。
  • std::vector将预分配一个缓冲区以允许向量增长,但如果向量增长超过缓冲区的大小,它将分配一个新缓冲区并将向量的全部内容复制到这个新缓冲区。
票数 3
EN

Stack Overflow用户

发布于 2009-07-25 19:17:52

标准可能要求符合标准的实现以某种方式运行--它们只能“保证”符合标准的实现以这种方式运行,因为根据定义,违反标准中要求的实现是不符合的。

std::vector的典型实现如何符合连续内存需求:它分配一定数量的空间(“容量”),如果当前大小赶上容量,它会重新分配空间(这相当于进行全新的分配,通常是当前容量的固定倍数,将当前内容复制到新空间,然后释放先前获得的空间)。

票数 3
EN

Stack Overflow用户

发布于 2009-07-25 20:05:07

要记住的一件事是,所有现代操作系统都有一种叫做Virtual Memory的东西。这使得任何程序都能够假定它能够完全访问该体系结构的最大可能内存量,而不管其他进程,甚至计算机中的物理RAM的大小。因此,在编译时,编译器可以在堆栈上自动分配足够的空间(如果在编译时知道所需的大小),或者它可以编写程序集在堆上动态分配内存,就好像整个内存空间都是可用的一样。这是一个抽象的层次,让事情变得非常简单。

操作系统所做的就是在各种正在运行的程序需要这些页时,负责将这些页交换到物理内存和从物理内存中交换出来。这样,没有程序需要担心其他程序,但您仍然可以同时运行程序。

当然,我正在极大地简化实际发生的事情,但我认为这至少回答了您的问题,即编译器如何判断哪些内存是空闲的;因为它可以假设所有内存都是空的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1183629

复制
相关文章
PushPlugin-为iOS的Hybird App提供APNS服务
APNS是iOS生态下面的推送机制。其原理是APP启动的时候,向苹果注册,并获得一个唯一token,然后不论app是否继续在运行,都可以通过调用苹果的APNS服务,来向持有token的设备推送消息,例如顶部的通知。
libo1106
2018/08/08
5460
java 生成本地ssl安全证书 springboot配置
SSL(Secure Sockets Layer 安全套接层)是为网络通信提供安全及数据完整性的一种安全协议,SSL在网络传输层对网络连接进行加密,SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通信提供安全支持。SSL协议分为两层,SSL记录协议建立在TCP之上,为高层协议提供数据封装、压缩、加密等基本功能支持。SSL握手协议建立在SSL记录协议之上,用户实际数据传输开始前进行身份验证、协商加密算法、交换加密秘钥。
用户5899361
2020/12/07
2.6K0
java 生成本地ssl安全证书 springboot配置
生成本地CA根证书、p12流程
安装 OpenSSL:首先,确保你的系统上安装了 OpenSSL 工具。如果尚未安装,你可以通过 Homebrew 或从 OpenSSL 官方网站下载并安装。
Raindew
2023/10/14
1.4K0
生成本地CA根证书、p12流程 EC篇
上述命令将生成一个 EC 私钥文件 root.key,使用 prime256v1 曲线参数。
Raindew
2023/10/14
7990
CA证书(数字证书的原理)
加密:通过加密算法和公钥对内容(或者说明文)进行加密,得到密文。加密过程需要用到公钥。
Centy Zhao
2019/12/26
9.8K3
SAP关于标准成本、计划成本、目标成本、实际成本
(1)标准成本=标准价*标准量即根据物料主数据上的标准价S*BOM上的物料数量等到标准价,一般来讲我们是通过T-codeCK24发布出来,即我们在物料主数据成本视图2看到的就是标准价。 (2)目标成本=标准价*实际量,标准价同(1),实际量的来源于T-codeCO11N的报工后的工时得到。所以如果你的目标成本有误,一定要去查一下是否没有报工。 (3)实际成本=实际价格*实际量,因为你是采用标准价,所以出入库都是标准价格,系统本身并没有实际价格,但是在CO88结算后会结算出产品差异,即标准价+差异=实际价格。
SAP最佳业务实践
2018/03/27
3.2K0
app store/ios开发证书、发布证书、推送证书的快捷制作
文章目录 前言 一、下载安装AppUploader工具 二、使用方法 1.中英文切换 2.证书制作 总结 前言 本文提供给那些无苹果电脑情况下想要快速制作ios证书的人群
iOS程序应用
2023/04/17
8470
app store/ios开发证书、发布证书、推送证书的快捷制作
根证书和中间证书的区别
让我们花几分钟时间讨论一下中间证书和根CA证书。SSL(或者更准确地说,TLS)是一项大多数终端用户知之甚少甚至一无所知的技术。即使是获取了SSL证书的人通常也只知道他们需要SSL证书,而且他们必须在服务器上安装SSL证书,才能通过HTTPS为网站提供服务。当提到中间证书和CAs、根证书和CAs时,大多数人的目光开始变得呆滞。
亚洲诚信SSL
2019/07/05
12.9K0
根证书和中间证书的区别
EV证书:级别最高的SSL证书
在当今数字化时代,保护网站和用户数据的安全应该是网站最重要的功能。EV(Extended Validation)证书是一种高级别的SSL证书,提供了更强的身份验证和在线安全保障。
稀糊牛肉粥
2023/10/18
4720
成本=固定成本+可变成本_可避免固定成本是机会成本吗
半可变(或半固定)成本:有些成本费用属于半可变成本,如不能熄灭的工业炉的燃料费等。
全栈程序员站长
2022/11/01
1.2K0
谈谈企业的成本
第一,我们了解经济学里的机会成本。机会成本就是你现在在A事情,但如果不做A,你可以做B这件事。那么对于A而言,B就是你的成本。你可能有很多机会,但成本有限,你只能选择做一个。比如说理财,你不要觉得不亏就行。对于机会成本来说,定期的理财收益就是你的机会成本。
石云升
2022/08/25
3680
iOS开发证书发布证书,推送证书,描述文件的生成总集
1.进入(Launchpad),找到   (我的是在其他里面找到的),运行后再左上角
爱学iOS的小麦子
2023/05/09
2920
Dropbox的成本估算
这个数字令人印象深刻,因为一年半前,它的用户总数已经是300万了。短短18个月,在一个这样大的基数上,继续扩张八倍多,真可谓势头惊人。
ruanyf
2018/09/21
4.2K1
Dropbox的成本估算
iOS开发证书发布证书,推送证书,描述文件的生成总集(一)
1.进入(Launchpad),找到 (我的是在其他里面找到的),运行后再左上角   2.存储在桌面就好了,然后就完成退出钥匙串工具就可以了。
iOS程序应用
2023/04/17
2780
【信管6.1】成本与成本规划
项目成本管理就是要确保在批准的预算内完成项目。虽然项目成本管理主要关心的是完成项目活动所需资源的成本,但也必须考虑项目决策对项目产品、服务或成果的使用成本的影响。总之,项目成本管理是项目管理铁三角的最后一个支点,在项目管理中占有非常重要的地位。
硬核项目经理
2023/03/02
5560
【信管6.1】成本与成本规划
iOS证书申请_安装证书
苹果的证书繁锁复杂,制作管理相当麻烦,今天决定重置一个游戏项目中的所有证书,做了这么多次还是感觉很纠结,索性直接记录下来,日后你我他查阅都方便;
全栈程序员站长
2022/09/20
2.5K0
iOS证书申请_安装证书
iOS开发证书发布证书,推送证书,描述文件的生成总集(一)​
1.进入(Launchpad),找到 (我的是在其他里面找到的),运行后再左上角​
iOS程序应用
2022/12/06
3320
jks证书转pem证书
用管理员权限打开一个cmd框,找到jdk的bin目录,然后执行如下命令:(请自行将jks文件拷贝至此)
华创信息技术
2019/12/18
6.6K0
缓存的收益和成本
通常情况下,我们在设计程序的时候,会在客户端和存储层之间加入缓存层(例如redis和memcache)。存储层一般用来持久化数据,而缓存层则是为了更快的返回所需要的的数据结果。
AsiaYe
2020/07/16
8560
缓存的收益和成本
通配符证书和单域名SSL证书的区别
  通配符证书和单域名SSL证书有什么区别?首先,我们先来了解通配符证书和单域名SSL证书的定义:
安信SSL证书
2019/07/31
5.6K0
通配符证书和单域名SSL证书的区别

相似问题

更改PushNotification的设置

10

AWS SSL证书与GoDaddy的成本

142

离子PushNotification

13

托管身份-是否节省了证书成本?

17

PushNotification警报标题

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文