如何以缓存友好的方式访问灵活数组的数组?

2024-02-28

I have records具有灵活的阵列成员

typedef struct record {
    unsigned foo;
    signed bar;
    double number[];
} record;

我有多个records与相同数量的numbers这样我就可以将它们排列成数组。我想将它们分配到一个连续的内存空间中。

const unsigned numbers = ...;
const unsigned records = ...;
const size_t record_size = sizeof(record) + numbers*sizeof(double);
record *prec = malloc(records*record_size);

所以现在我知道了record_size我可以访问它,但最佳实践是什么,如何通过给定的方式正确、安全地做到这一点record index?

当我将包含的标题分开时我可以做到这一点foo and bar and numbers,但我想保留record在一起以实现缓存一致性。


由于只有您知道实际的布局,因此 C 编译器无法帮助您。因此,您必须自己进行地址计算。需要进行一些强制转换才能在字节级别进行指针算术:

record * get_record(record *base, size_t numbers, size_t index)
{
  return (record *) ((unsigned char *) base +
                    index * (sizeof *base + numbers * sizeof *base->number));
}

鉴于上述(和你的代码);您可以像这样访问该数组:

record *first = get_record(base, numbers, 0);
first->foo = 4711;
record *second = get_record(base, numbers, 1);
second->foo = 17;

一个明显的缺点是你必须保留numbers值周围。这可以通过使用显式“基”结构对整个数组进行建模来改进,该结构保存每个元素的大小和基指针。当然,它可以与元素本身共同分配,以将其全部放在一起并减少所涉及指针的距离。

Also, 请不要转换返回值malloc() in C https://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc.

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

如何以缓存友好的方式访问灵活数组的数组? 的相关文章

  • C++ 天花板函数的奇怪结果

    我一直在尝试天花板功能并得到一些奇怪的结果 如果我对十进制数乘以百执行 ceil 运算 我会得到一定的结果 但是 如果我直接对该乘法的结果执行 ceil 我会得到完全不同的输出 另一个问题是 这些不同的结果仅发生在某些数字上 任何帮助 将不
  • Web 应用程序框架:C++ 与 Python

    作为一名程序员 我熟悉 Python 和 C 我正在考虑编写自己的简单 Web 应用程序 并且想知道哪种语言更适合服务器端 Web 开发 我正在寻找一些东西 它必须是直观的 我认识到 Wt 存在并且它遵循 Qt 的模型 我讨厌 Qt 的一件
  • OpenGL,如何独立旋转对象?

    到目前为止我的代码 void display void glClear GL COLOR BUFFER BIT GL DEPTH BUFFER BIT Clear Screen And Depth Buffer glLoadIdentity
  • 子进程中的变量修改

    我正在研究科比和奥哈拉伦的作品Computer Systems A Programmer s Perspective 练习 8 16 要求程序的输出如下 我更改了它 因为他们使用了一个你可以在他们的网站上下载的头文件 include
  • 公共领域有哪些替代方案?

    我正在用 java 编写一个游戏 正如问题标题建议的那样 我在类中使用公共字段 暂且 据我所知 公共领域很糟糕 我有一些理解其中的原因 但如果有人能澄清为什么你不应该使用它们 那将不胜感激 问题是 从我所看到的来看 这似乎是合乎逻辑的 是使
  • 析构函数、dispose 和 Finalize 方法之间的区别

    我正在研究垃圾收集器在 C 中的工作原理 我对使用感到困惑Destructor Dispose and Finalize方法 根据我的研究和理解 在我的类中拥有析构函数方法将告诉垃圾收集器以析构函数方法中提到的方式执行垃圾收集 该方法不能在
  • 如何使用 DesignData 帮助开发 Metro 应用程序?

    我一直在 Windows Phone 应用程序中愉快地使用 DesignData 我希望使用它来帮助在 VS2012 Blend for VS 中的 Metro 风格应用程序中可视化设计 我已经尝试过希望显而易见的方法
  • 使用 MessagingCenter 和标准 .NET 事件处理程序向感兴趣的各方通知更改有什么区别?

    使用 MessagingCenter 和标准 NET 事件处理程序向感兴趣的各方通知更改有什么区别 下面演示了同一事物的两个 未经测试的 实现 public class FooClass public event EventHandler
  • C语言中的array、&array、&array[0]有什么区别? [复制]

    这个问题在这里已经有答案了 在学习C语言中的数组和指针时 我很困惑 为什么ch ch ch 0 彼此相等 而sptr sptr sptr 0 却不相等 这是我的源代码 int main void char ch 7 1 2 3 4 5 6
  • 将数字 n 拆分为 k 个不同数字的总和

    我有一个数字 n 我必须将它分成 k 个数字 使得所有 k 个数字都是不同的 k 个数字的总和等于 n 并且 k 最大 例如 如果 n 为 9 则答案应为 1 2 6 如果 n 为 15 则答案应为 1 2 3 4 5 这就是我尝试过的 v
  • 访问结构向量

    我有一个结构 struct OutputStore int myINT string mySTRING 如果我创建一个 OutputStore 类型的数组 如下所示 OutputStore OutputFileData new Output
  • 为什么 C++ 元组如此奇怪?

    我通常创建自定义structs将不同类型的值分组在一起时 这通常很好 而且我个人发现命名成员访问更容易阅读 但我想创建一个更通用的 API 在其他语言中广泛使用元组后 我想返回类型的值std tuple但发现它们在 C 中使用比在其他语言中
  • 将数组显式衰减为指针

    最简洁 最惯用的方式是什么明确地将数组衰减为指针 例如 考虑您需要能够指导 SFINAE 或明确过载的情况 template
  • C# 的 xml 序列化中是否有一个属性可以跳过空数组?

    C 的 xml 序列化中是否有一个属性可以跳过空数组 这将提高 xml 输出的可读性 好吧 你也许可以添加一个ShouldSerializeFoo method using System using System ComponentMode
  • 仅最后一个用户控件显示内容控件

    我有一个奇怪的问题 我创建了一个带有标签和画布的用户控件 画布引用资源 但画布仅显示在我的堆栈面板中的最后一个控件上 这是我的窗户
  • 将 .NET 类库(主要定义 CRUD 操作)公开为服务

    公开现有内容的最佳 有效和最快的方法是什么 类 图书馆 主要定义 CRUD 操作 作为service 周转基金服务 or WCF数据服务 以便它可以与银光 or Ajax 在那儿tools 代码生成器 RAD 工具 哪些可以支持这个 预先感
  • 使用 System.Json 迭代 JSON

    我正在探索 NET 4 5 的功能System Json库 但没有太多文档 而且由于流行的 JSON NET 库 搜索起来相当棘手 我基本上想知道 我如何循环一些 JSON 例如 People Simon Age 25 Steve Age
  • Lambda 按值捕获和“mutable”关键字

    关键词的必要性mutable在 lambda 中 是造成极大混乱的根源 考虑代码 int x 10 function
  • 致命:所有操作都需要OperationId。请为路径的“获取”操作添加它

    我正在使用 AutoRest 从 swagger json 生成 api 的客户端 输出是 AutoRest code generation utility cli version 3 0 6187 node v10 16 3 max me
  • InvalidOperationException:没有为方案“CookieSettings”注册身份验证处理程序

    我正在使用 ASP Net MVC core 2 1 开发一个应用程序 其中不断出现以下异常 InvalidOperationException 没有为方案 CookieSettings 注册身份验证处理程序 注册的方案有 Identity

随机推荐

  • C++ 中默认初始化的全局强类型枚举是什么?

    我试图确定全局强类型枚举初始化的默认值 下面的代码当然不能编译 include
  • Java JDBC 插入后检索 ID

    我使用触发器来设置所有表的 PK 列值 因此我不会对 java 中的 ID 进行任何操作 但我需要插入后的 ID 我怎样才能拿到身份证 stat execute INSERT INTO TPROJECT PROCESS GROUP NPRO
  • 如何将日期时间字符串转换为当前区域性日期时间字符串

    我有一个字符串 用美国英语文化表示 12 1 2011 我当前的机器文化是英国英语 格式为 dd mm yyyy 如何将 12 1 2011 转换为 1 12 2011 我尝试过以下格式 System DateTime Parse resu
  • 仅当行数低于限制时 Postgres 才插入行

    我希望在 Postgres 10 中有一个 SQL 语句或函数 允许我仅在行数少于一定数量的情况下插入行 select count from mytable where mykey 1 do the following only if th
  • 如何将 SQlite 中的数据显示到 iPhone 应用程序的表视图中

    我正在 Xcode 4 3 中使用 SQlite3 开发 iPhone 项目 SQlite 和 Xcode 之间的连接已完成 现在我想将我的数据显示到表视图 三个视图 中 并且它是只读的 所以我有主表视图 选择原始 gt 进入第二个视图并从
  • 使用 Vagrant 管理开发和生产环境?

    人们如何使用 vagrant 最好来自同一个 vagrantfile 处理开发 生产环境的简单自动化 使用 puppet 我试图解决的用例 如果没有创建的话 我很乐意用 vagrant 来启动生产机器 如果在我的开发环境的 puppet 文
  • 直到阈值为止的数字列表的总和

    我有一个整数列表 我想要对其进行求和 直到满足阈值 然后能够访问达到阈值的索引 就像是 summing lt function i sum sum list i index i while sum lt thresholdValue sum
  • HTML5 视频 - 设置 video.currentTime 会破坏播放器

    我正在尝试与 Chrome 中的第三方 html5 视频播放器进行交互 我能够因此获得对它的有效引用 document getElementsByTagName video 1 以及readyState是 4 所以一切都很好 我可以成功 并
  • Gradle - 排除配置的依赖关系,但不排除继承配置的依赖关系

    使用 Gradle 1 0 里程碑 8 我的项目使用 slf4j Logback 进行日志记录 因此我想防止 log4j 上的任何传递依赖项污染我的类路径 因此 我添加了全局排除 如下所示 configurations all exclud
  • 定义自定义颜色变量

    我想在我的代码中全局更改一些按钮颜色 我似乎无法找到一种定义颜色变量然后为该变量分配颜色值的方法 我试过这个 颜色 SelectedColor new Color f1 setBackgroundColor Color rgb 0 0 10
  • C# 以编程方式执行 TNSPing

    是否可以以编程方式在 Oracle 数据库上执行 TNSPing 我知道我可能可以调用 TNSPing 程序并解析生成的任何输出 但我正在寻找一种更强大的方法来处理数据库 TNS Ping 看过了平级 http msdn microsoft
  • 为什么 String 的 format(Object...args) 定义为静态方法?

    我想知道为什么Java5 及以上版本提供了使用 String 类中的静态方法的 printf 样式格式化程序 如下所示 public static String format String format Object args 代替 pub
  • 如何在 ASP.Net 应用程序上使用 salting+hashing?

    我正在从头开始构建一个项目 并且我想以正确的方式做事 我在网上读过有关哈希的内容 这基本上就是将密码转换为 64 个字母的繁文缛节 对吗 腌制怎么样 我的问题是 如何使用 C 对字符串进行哈希处理 MSSQL 中的字段声明类型是什么 nva
  • MVC HTML5 电子邮件标签

    我有一个模型 Required ErrorMessage Email required DataType DataType EmailAddress ErrorMessage Please enter valid email address
  • PowerPoint VBA 中的睡眠/等待计时器不是 CPU 密集型的

    我目前正在制作一个 PowerPoint 演示文稿 该演示文稿在计算机上用作某种信息亭或信息屏幕 它从磁盘上的文本文件中读取文本 该文本文件中的文本显示在 PowerPoint 的文本框中 并且每 5 秒刷新一次 这样我们就可以编辑 Pow
  • 从查询引用子表单

    在 MS Access 2010 中 我有一个查询 它在条件中引用了以下内容 Forms frm Add Item Subform ActiveControl Caption 这使我可以在查询中使用按钮的 标题 文本 以下代码位于 Butt
  • 将触摸和手势转发到 UIScrollview 的视图

    我在转发手势和触摸时遇到一些问题 我玩了很多次 但我无法让它按照我想要的方式工作 基本上我想用 2 个手指控制双屏幕上的滚动视图 并将其他所有内容转发到重叠滚动视图后面的 ipad 视图 为了能够控制双屏上的滚动视图 我进行了子类化UISc
  • 如何将包含 7 位毫秒数的日期字符串转换为 Python 中的日期

    当毫秒有 6 位数字时 f 有效 但如果超过 6 位数字 则会抛出错误 我有一个临时解决方案 将第 7 位硬编码为 0 但是有更好的方法吗 目前以下作品 print datetime datetime strptime 2014 11 19
  • ActiveAdmin - 如何在自定义操作中呈现默认模板

    我们在 Rails3 应用程序中使用 ActiveAdmin 作为默认模型 现在我们需要覆盖显示操作 OrderProcess 模型是瞬态 无表 模型 这意味着所有字段都是从其他数据聚合而来的 我们使用一个内部模块 它提供了必要的方法来模拟
  • 如何以缓存友好的方式访问灵活数组的数组?

    I have records具有灵活的阵列成员 typedef struct record unsigned foo signed bar double number record 我有多个records与相同数量的numbers这样我就可