为什么gcc中malloc将值初始化为0?

2024-03-01

可能各个平台的情况不一样,但是

当我使用 gcc 编译并运行下面的代码时,我在 ubuntu 11.10 中每次都得到 0。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    double *a = malloc(sizeof(double)*100)
    printf("%f", *a);
}

为什么尽管有calloc,malloc 的行为还是这样?

这是否意味着仅仅将值初始化为 0 就会产生不必要的性能开销,即使有时您不希望如此?


编辑:哦,我之前的例子不是初始化,而是碰巧使用了“fresh”块。

我正是在寻找的是为什么它在分配大块时初始化它:

int main()
{
    int *a = malloc(sizeof(int)*200000);
    a[10] = 3;
    printf("%d", *(a+10));

    free(a);

    a = malloc(sizeof(double)*200000);
    printf("%d", *(a+10));
}

OUTPUT: 3
        0 (initialized)

但感谢您指出分配时存在安全原因! (从来没想过)。当然,在分配新块或大块时,它必须初始化为零。


简短回答:

事实并非如此,在你的情况下它恰好为零。
(此外,您的测试用例并不显示数据为零。它仅显示一个元素是否为零。)


长答案:

你打电话时malloc(),将会发生以下两种情况之一:

  1. 它回收先前从同一进程分配和释放的内存。
  2. 它从操作系统请求新页面。

在第一种情况下,内存将包含先前分配剩余的数据。所以它不会是零。这是执行小额分配时的常见情况。

在第二种情况下,内存将来自操作系统。当程序内存不足时,或者当您请求非常大的分配时,就会发生这种情况。 (就像你的例子中的情况一样)

这里有一个问题:来自操作系统的内存将被归零security原因。*

当操作系统为您提供内存时,它可能已从不同的进程中释放。因此该内存可能包含密码等敏感信息。因此,为了防止您读取此类数据,操作系统在将其提供给您之前会将其清零。

*I note that the C standard says nothing about this. This is strictly an OS behavior. So this zeroing may or may not be present on systems where security is not a concern.


为了提供更多的性能背景:

作为@R。在评论中提到,这个归零就是为什么你应该总是use calloc()代替malloc() + memset() https://stackoverflow.com/questions/2688466/why-mallocmemset-slower-than-calloc?lq=1. calloc()可以利用这一事实来避免单独的memset().


另一方面,这种归零有时会成为性能瓶颈。在一些数值应用中(例如异位FFT http://en.wikipedia.org/wiki/Fast_Fourier_transform),你需要分配一大块临时内存。用它来执行任何算法,然后释放它。

在这些情况下,调零是不必要的并且相当于纯粹的开销。

The most extreme example I've seen is a 20-second zeroing overhead for a 70-second operation with a 48 GB scratch buffer. (Roughly 30% overhead.) (Granted: the machine did have a lack of memory bandwidth.)

显而易见的解决方案是简单地手动重用内存。但这往往需要突破既定的接口。 (特别是如果它是图书馆例程的一部分)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么gcc中malloc将值初始化为0? 的相关文章

  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 执行命令而不将其保留在历史记录中[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在进行软件开发时 经常需要在命令行命令中包含机密信息 典型示例是将项目部署到服务器的凭据设置为环境变量 当我不想将某些命令存储在命令历史记
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • SSH,运行进程然后忽略输出

    我有一个命令可以使用 SSH 并在 SSH 后运行脚本 该脚本运行一个二进制文件 脚本完成后 我可以输入任意键 本地终端将恢复到正常状态 但是 由于该进程仍在我通过 SSH 连接的计算机中运行 因此任何时候它都会登录到stdout我在本地终
  • 有没有一种快速方法可以从 Jar/war 中删除文件,而无需提取 jar 并重新创建它?

    所以我需要从 jar war 文件中删除一个文件 我希望有类似 jar d myjar jar file I donot need txt 的内容 但现在我能看到从 Linux 命令行执行此操作的唯一方法 不使用 WinRAR Winzip
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • 在 RSpec 中存根 RestClient 响应

    我有以下规格 describe successful POST on user create do it should redirect to dashboard do post user create name gt dave email
  • 在带有 npm 的 Lambda 函数中使用 AWS Cognito

    我正在尝试在 Lambda 函数中使用 AWS Cognito 来授权用户 我有一些来自 Udemy 课程的示例代码 不再可用 https www udemy com minimum viable aws cognito user auth
  • 使用 javascript 测试多屏幕

    是否可以判断网站的用户是否使用多个显示器 我需要找到弹出窗口的位置 但用户很可能有多个显示器设置 同时window screenX等将给出浏览器窗口的位置 这对于多个显示器来说是无用的 我在 StackOverflow 上的任何地方都没有找
  • 如何在 iPhone 上记录 SQLite 查询

    我正在开发一个 iPhone 应用程序 并且使用 SQLite 问题是我的查询有一些问题 我做了错误的绑定 所以 这是我的问题 如何使用 SQLite 接收的绑定在我的 iPhone 应用程序中登录有效的 SQL 查询 语句 Thanks
  • 2 个以上线程写入/读取变量的真正危险

    同时读 写单个变量的真正危险是什么 如果我使用一个线程写入一个变量 另一个线程在 while 循环中读取该变量 并且在写入变量时读取该变量并且使用旧值 则不会有危险 这里还有什么危险 同时读 写是否会导致线程崩溃 或者当发生精确的同时读 写
  • 在asp.net core中模拟用户

    我有来自常规 mvc 应用程序的以下代码 它通过模拟用户上传文件 public class PublicController Controller public const int LOGON32 LOGON INTERACTIVE 2 p
  • C++ 映射中的 C 样式数组

    注意 这个问题仅涉及 C 中的映射和数组 碰巧我正在使用 OpenGL 所以那些没有 OpenGL 知识的人不应该阻止进一步阅读 我正在尝试将 C 样式数组放入 C 中std map供以后设置颜色时使用 const map
  • 从 Gorm 模型创建主键时出现问题

    从 Gorm 模型创建主键时 它返回错误 重复列名 id 我的模型看起来像 type User struct gorm Model Id string gorm primary key FirstName string LastName s
  • 在 PHP 闭包中注入代码

    我有一个已经定义的闭包 我想在执行它时在其中注入代码 这是一个例子 predefined print my predefined injected code br closure function print hello br call u
  • 有效证书上的 axios 证书已过期[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 编辑 这是由于https letsencrypt org docs dst root ca x3 expiration septe
  • 流星从复选框 switchChange 中检索 true/false 值

    我有一个附加到复选框的事件处理程序 我正在使用引导开关http www bootstrap switch org http www bootstrap switch org 我试图将 true 或 false 的状态值获取到变量中 以便我可
  • Windows 或 ASP.NET 服务中的 System.Drawing

    根据MSDN http msdn microsoft com en us library system drawing aspx 在 中使用类并不是一个特别好的主意系统图Windows 服务或 ASP NET 服务中的命名空间 现在我正在开
  • 将证书从智能卡复制到计算机

    是否可以将证书从智能卡复制到计算机并 用它来登录某个站点 在 Mac 上 这些证书出现在钥匙串中 并且可以保存到磁盘 但我不确定如何强制站点提示对话框屏幕以选择证书 连接智能卡后 会出现提示并要求选择证书 智能卡包含由封装在 X509 证书
  • 隐藏重复行 SSRS 2008 R2

    我的报告中出现重复的数据 因为源表有重复的数据 在不创建组的情况下 我想隐藏重复的数据写入表达式 所以我做了什么 我选择表行并为表行的隐藏属性添加一个表达式 表情就像是 上一个 字段 ID 值 字段 ID 值 但它不起作用 仍然显示重复的数
  • 选择组中第 i 个 jQuery 对象比 $($(".someclass")[i])) 更简单的方法?

    所以我试图循环遍历 someclass 的成员 不是 DOM 元素 而是它们的 jQuery 对应元素 我一直在使用 someclass i 但这非常丑陋 有更自然的方法来做到这一点吗 你可以使用eq http api jquery com
  • 动态控件组和复选框无样式

    所以我尝试将动态内容直接加载到我的复选框容器 group checkboxes 中 div div 这是我正在运行的用于填充容器的语句 group checkboxes append fieldset fieldset
  • 使重叠内容的容器适合最大孩子的高度

    我正在构建一个在 3 个引号之间旋转的轮播 幻灯片类型小部件 假设标记如下所示 div class carousel blockquote blockquote blockquote blockquote blockquote blockq
  • Laravel 中的“请提供有效的缓存路径”错误

    我复制了一个正在运行的 Laravel 应用程序并将其重命名以用于另一个应用程序 我删除了供应商文件夹并再次运行以下命令 composer self update composer update npm install bower inst
  • 表格页脚自动跨过表格宽度

    我有一张桌子 里面有动态列数取决于我收到的数据 我有一个标签需要分布在所有列上 与表中的列数无关 table thead tr th span ColA span th th span ColB span th th span Col br
  • 为什么gcc中malloc将值初始化为0?

    可能各个平台的情况不一样 但是 当我使用 gcc 编译并运行下面的代码时 我在 ubuntu 11 10 中每次都得到 0 include