对对齐的 malloc 实现的解释

2024-03-17

这不是作业,这纯粹是为了我自己的个人教育。

我不知道如何实现对齐的 malloc 所以在网上查找并发现这个网站 https://sites.google.com/site/ruslancray/lab/bookshelf/interview/ci/low-level/write-an-aligned-malloc-free-function。为了方便阅读,我将发布以下代码:

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

void* aligned_malloc(size_t required_bytes, size_t alignment)
{
    void* p1; // original block
    void** p2; // aligned block
    int offset = alignment - 1 + sizeof(void*);
    if ((p1 = (void*)malloc(required_bytes + offset)) == NULL)
    {
       return NULL;
    }
    p2 = (void**)(((size_t)(p1) + offset) & ~(alignment - 1));
    p2[-1] = p1;
    return p2;
}

void aligned_free(void *p)
{
    free(((void**)p)[-1]);
}

void main (int argc, char *argv[])
{
    char **endptr;
    int *p = aligned_malloc (100, strtol(argv[1], endptr, 10));

    printf ("%s: %p\n", argv[1], p);
    aligned_free (p);
}

该实现确实有效,但老实说我不知道​​它是如何工作的。

这是我无法理解的:

  1. 为什么我们需要偏移量?
  2. anding 和 是什么~(alignment - 1)完成
  3. p2是一个双指针。为什么我们可以从一个应该只返回单个指针的函数中返回它?
  4. 解决这个问题的一般方法是什么?

非常感谢任何帮助。

EDIT

这不是重复的如何仅使用标准库分配对齐内存? https://stackoverflow.com/questions/227897/how-to-allocate-aligned-memory-only-using-the-standard-library因为我还需要知道如何释放对齐的内存。


  1. 如果您想支持超出系统范围的对齐,则需要偏移量malloc()做。例如,如果您的系统malloc()对齐到 8 字节边界,并且您想要对齐到 16 字节,您要求额外 8 个字节,这样您就可以确定可以移动结果以按要求对齐。您还添加sizeof(void*)到你传递给的大小malloc()为簿记留出空间。

  2. ~(alignment - 1)是保证对齐的原因。例如,如果对齐方式为 16,则减去 1 得到 15,即 0xF,然后对其求反,得到 0xFF..FF0,这是您需要满足从以下位置返回的任何指针的对齐方式的掩码:malloc()。请注意,这个技巧假设对齐是 2 的幂(实际上通常是这样,但确实应该进行检查)。

  3. It's a void**。函数返回void*。这是可以的,因为指向 void 的指针是“指向任何类型的指针”,在这种情况下,该类型是void*。换句话说,转换void*允许往返于其他指针类型,并且双指针仍然是指针。

  4. 这里的总体方案是将原始指针存储在返回给调用者的指针之前。标准的一些实现malloc()做同样的事情:在返回的块之前存储簿记信息。这使得很容易知道何时回收多少空间free()叫做。

话虽如此,这种事情通常没有用,因为标准malloc()返回系统上最大的对齐方式。如果您需要除此之外的对齐,可能还有其他解决方案,包括特定于编译器的属性。

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

对对齐的 malloc 实现的解释 的相关文章

  • 使用 C#.net 中的私有存储库的身份验证读取 BitBucket API

    我已经尝试了几天让 BitBucket API 为我工作 但是当涉及到让它为具有身份验证的私有存储库工作时 将问题设置为私有 当它们设置为公开 无需身份验证 一切正常 代码示例如下 static void Main string args
  • 如何将动态数据写入 MVC 3 Razor 中的页面布局?

    我有带有 Razor 引擎的 MVC 3 C 项目 将动态数据写入 Layout cshtml 的方法和最佳实践是什么 例如 也许我想在网站的右上角显示用户名 该名称来自会话 数据库或基于用户登录的任何内容 更新 我也在寻找将某些数据渲染到
  • ASP.NET 如何在 Web API 中读取多部分表单数据?

    我将多部分表单数据发送到我的 Web API 如下所示 string example my string HttpContent stringContent new StringContent example HttpContent fil
  • 如何进行Visual Studio格式字典初始化?

    所有 Visual Studio 也包括 2012 不格式化以下内容 messageProcessor new Dictionary
  • C 中的双重否定:是否保证返回 0/1?

    Is x 标准保证返回0 1 请注意 我是not询问 C 其中定义了 bool 类型 是的 在 C99 中 请参阅 6 5 3 3 4 逻辑非运算符的结果 是0如果其操作数的值比较 不等于0 1如果其操作数的值比较等于 0 结果具有类型in
  • 公共基类打破了元组的空基类优化

    gcc 4 7 1 对元组进行空基类优化 我认为这是一个非常有用的功能 然而 这似乎有一个意想不到的限制 include
  • 如何在 C# 中创建 PKCS12 .p12 文件?

    这可能是一个n00b问题 但我在这方面确实没有任何经验 我需要创建一个包含 X509 证书和私钥的 p12 捆绑包 我当前有两个对象 X509Certificate2 和包含关键信息的 RSAParameters 对象 如何将它们合并到 p
  • 如何在控制器中使用多个 DBContext

    如何在控制器中使用多个 DBContext 我尝试以不同的方式重载构造函数 一些控制器 public C1 DBContext1 a DBContext2 b DBContext3 c public C1 DBContext1 a publ
  • Xcode 新手无法用 C++ 打开文件?

    我一直在我参加的课程中使用 Windows 但我正在尝试运行基本代码来弄清楚如何从 Xcode 上的文件打开 关闭 输入 输出 而我通常在 Visual Studio 上使用的代码不是不知道为什么 谢谢 include
  • 如何检查给定调用站点的重载决策集

    如何检查重载解析集 我在多个调用站点中使用了 4 个相互竞争的函数 在一个调用站点中 我期望调用一个函数 但编译器会选择另一个函数 我不知道为什么 这不是微不足道的 为了了解发生了什么 我正在使用enable if disable if打开
  • 哪个更快?按引用传递与按值传递 C++

    我认为按引用传递应该比按值传递更快 因为计算机不复制数据 它只是指向数据的地址 但是 请考虑以下 C 代码 include
  • 指向 VLA 的指针

    你可能知道 VLA 的优点和缺点 https stackoverflow com a 3082302 1606345在 C11 中它们是可选的 我认为使 VLA 成为可选的主要原因是 堆栈可能会爆炸 int arr n where n 10
  • Bazel:将编译标志添加到默认 C++ 工具链

    我想向默认的 C 工具链添加一些编译器和链接器标志 以便我构建的所有目标 本地或导入 共享它们 我知道可以定义我自己的工具链 但我不想这样做 因为它非常复杂且容易出错 理想情况下我想要这样的东西 cc toolchain cc defaul
  • 从 cin 读取整数序列并将它们存储在向量中

    这就是我读取整数的方法std cin并将它们存储在向量中 int number vector
  • 为什么将未使用的返回值转换为 void?

    int fn void whatever void fn 是否有任何理由将未使用的返回值强制转换为 void 或者我认为这完全是浪费时间 David s answer https stackoverflow com questions 68
  • 来自用户定义文字的整数字符序列,以字符串作为参数

    目前 只有双精度数可以在用户定义的文字中生成字符模板 template
  • OpenSSL:无需 SSL_read() / SSL_write() 即可执行加密/解密

    我已经用 C 语言编写了一个基于事件的网络库 现在我想通过 OpenSSL 添加 SSL TLS 支持 而不是使用SSL read and SSL write 我宁愿让 OpenSSL 只执行传出 传入数据的加密 解密 让我自己传输 接收数
  • 在 C++ 中什么时候首选传递指针而不是引用传递?

    我可以想象一种情况 其中输入参数可以为 NULL 以便首选传递指针而不是传递引用 有人可以添加更多案例吗 在传递的对象实际上将被修改的情况下 有些人更喜欢传递指针 当对象通过引用传递时 它们使用 pass by const referenc
  • OpenCV 仅围绕大轮廓绘制矩形?

    第一次发帖 希望我以正确的方式放置代码 我正在尝试检测和计算视频中的车辆 因此 如果您查看下面的代码 我会在阈值处理和膨胀后找到图像的轮廓 然后我使用 drawContours 和矩形在检测到的轮廓周围绘制一个框 我试图在 drawCont
  • 从最大到最小的3个整数

    我是 C 初学者 我使用 编程 使用 C 的原理与实践 第二版 问题如下 编写一个程序 提示用户输入三个整数值 然后以逗号分隔的数字顺序输出这些值 如果两个值相同 则应将它们排列在一起 include

随机推荐

  • 如何快速访问视图子层

    我想通过编写以下内容来访问 swift 4 1 中的视图子层 for layer CALayer in myView layer sublayers Code 但出现错误 输入 CALayer 不符合协议 序列 这是否意味着CALayerf
  • Express:我可以在一个app.use中使用多个中间件吗?

    我有很多充满样板代码的应用程序 如下所示 app use bodyParser json app use bodyParser urlencoded extended false app use cookieParser app use r
  • FastAPI 的 RedirectResponse 在 Swagger UI 中无法按预期工作

    我有一个带下载端点的 FastAPI 应用程序 此下载端点的作用是使用BlobServiceClient 对于 Azure Blob 存储 生成请求中指定的文件的令牌和 Blob URL 我想要做的是将用户重定向到该 URL 这是下载点的代
  • django apache 配置与 WSGIDaemonProcess 不起作用

    更新的问题 Mon Jul 18 09 20 10 517873 2016 error pid 30316 tid 139756302964480 remote 122 164 94 99 48261 Traceback most rece
  • Javascript导入函数语法[重复]

    这个问题在这里已经有答案了 我试图从另一个模块导入函数 但在运行时出现错误 TypeError this getData is not a function data js function getData return id 1 name
  • 是否有用于 ipv4 和 ipv6 地址的标准 .NET 解码器?

    我想编写一个相当简单的客户端 服务器网络应用程序 我只使用纯 IPv4 网络 但如果我的代码能够面向未来 那就太好了 我可能会使用 TcpListener TcpClient 因为WCF初步调查 http msdn microsoft co
  • 媒体查询是否继承媒体查询中未指定的值?

    我正在使用媒体查询和弹性框来使我的网站做出响应 我认为我在这里有点愚蠢 但说我有包装器的 css 类 如下所示 wrapper display flex flex wrap wrap width 100 margin 0 auto padd
  • 使用不同的符号表重新计算 Boost Spirit 解析的属性的最有效方法是什么?

    我正在使用 Boost Spirit 来实现某些软件中的功能 该功能允许用户输入将重复应用于输入流的数学方程 输入流值使用符号表示boost spirit qi symbols用户可以在他们的方程中引用 例如 out1 3 in1 in2
  • ChildProcess关闭、退出事件之间的区别

    当通过生成子进程时spawn exec 在 Node js 中 有一个 close and an exit 子进程上的事件 这两者有什么区别 什么时候需要使用什么 在 Node js 0 7 7 之前 子进程上只有 退出 事件 没有 关闭
  • 如何使用 PHP 页面使用自定义用户名验证的 WCF Web 服务?

    我很难从 PHP 站点使用安全的 WCF Web 服务 我对 PHP 的了解有限 我在网上找到了各种示例 但还没有成功地使它们工作 我有一个 Silverlight 应用程序也使用这个 WebService 并且它工作正常 但是当我运行 P
  • 如何使用 git 仅暂存新文件的一部分?

    I love git add 交互式 现在它已成为我日常工作流程的一部分 问题似乎不适用于未跟踪的文件 我想要做的是跟踪一个新文件 但只添加其中的一部分 即这个新文件的某些部分尚未准备好进行暂存 例如 使用 git add i 我可以选择补
  • 插件Android支持异常,Worker因异常退出

    我刚刚在 Linux 上更新到 Android Studio 2 2 2 稳定版 现在经常崩溃 已经尝试过 使缓存无效 重新启动 清洁工程 删除 gradle 缓存 rm gradle caches rf 删除 Android Studio
  • 如何将 sitemap.xml 添加到 angularJS 站点?

    我在应用程序文件夹中添加了 sitemap xml 但如何将其公开以便谷歌网站管理员工具可以获取它 Thanks 来自谷歌的文档 有两种不同的方法可以让 Google 可以使用您的站点地图 OR 插入 在 robots txt 文件中的任意
  • 通过指针访问是否会改变严格的别名语义?

    有了这些定义 struct My Header uintptr t bits struct Foo Type struct My Header header int x struct Foo Type foo struct Bar Type
  • 信号栈

    我确实读到信号需要有一个单独的堆栈 您认为它为什么以及如何实现 它们是动态分配还是静态分配 内存分配是如何完成的 所有信号都一样吗 信号需要单独堆栈的原因是 如果正常堆栈损坏或溢出 信号仍然可以执行 我认为信号堆栈通常是动态分配的 但它可以
  • htmlspecialchars_decode() 不适用于空格

    我正在尝试使用 htmlspecialchars decode 但它不解码 nbsp 进入空间 这个问题有解决办法吗 My code query mysql query select from nowosci order by id des
  • 如何使用 Django/nginx 部署仅 HTTPS 的站点?

    我原来的问题是如何为 Django 登录页面启用 HTTPS https stackoverflow com questions 8015685 how to enable https in django auth generated pa
  • 如何使用 Selenium WebDriver 获取 HTTP 响应代码

    我已经使用 Selenium2 WebDriver 编写了测试 并且想要测试 HTTP 请求是否返回 HTTP 403 Forbidden 是否可以使用 Selenium WebDriver 获取 HTTP 响应状态代码 一句话 不 使用
  • 将图像图标添加到按钮/标签 Swing

    我知道这个问题已经发布了 但我已经尝试了我发现的所有内容 但没有任何效果 我有一个 Maven 项目 我想在按钮上使用图像 我把图像放在src main res folder Maven clean Maven 安装后 我的所有图像都可以在
  • 对对齐的 malloc 实现的解释

    这不是作业 这纯粹是为了我自己的个人教育 我不知道如何实现对齐的 malloc 所以在网上查找并发现这个网站 https sites google com site ruslancray lab bookshelf interview ci