当前位置: 首页 > 面试题库 >

快速访问可变长度数组

樊琦
2023-03-14
问题内容

Core Audio具有C API,可将一些数据复制到您提供的内存中。在一种情况下,我需要传递一个指向AudioBufferList的指针,该指针定义为:

struct AudioBufferList {
    var mNumberBuffers: UInt32
    var mBuffers: (AudioBuffer) // this is a variable length array of mNumberBuffers elements
}

UInt32标识缓冲区的数量,并且实际缓冲区紧随其后。

我可以成功获得此:

let bufferList = UnsafeMutablePointer<AudioBufferList>.alloc(Int(propsize));
AudioObjectGetPropertyData(self.audioDeviceID, &address, 0, nil, &propsize, bufferList);

我无法识别(AudioBuffer)语法,但我认为它并不重要-
我认为括号会被忽略,mBuffers只是一个AudioBuffer,由我自己完成指针数学运算以查找第二个语法。

我尝试了这个:

let buffer = UnsafeMutablePointer<AudioBuffer>(&bufferList.memory.mBuffers);
// and index via buffer += index;
// Cannot invoke 'init' with an argument of type 'inout (AudioBuffer)'

还尝试了:

let buffer = UnsafeMutablePointer<Array<AudioBuffer>>(&bufferList.memory.mBuffers);
// and index via buffer[index];
// error: Cannot invoke 'init' with an argument of type '@lvalue (AudioBuffer)'

笼统地说:在Swift中,如何将UnsafeMutablePointer带到一个结构并将其视为这些结构的数组?


问题答案:

您可以创建一个从给定地址开始并具有给定元素数量的缓冲区指针:

let buffers = UnsafeBufferPointer<AudioBuffer>(start: &bufferList.memory.mBuffers,
    count: Int(bufferList.memory.mNumberBuffers))

for buf in buffers {
    // ...
}

Swift 3(及更高版本)的更新:

let buffers = UnsafeBufferPointer<AudioBuffer>(start: &bufferList.pointee.mBuffers,
    count: Int(bufferList.pointee.mNumberBuffers))

for buf in buffers {
    // ...
}


 类似资料:
  • 问题内容: 在php中,我经常需要使用数组来映射变量…但是我似乎无法在一个内衬中做到这一点。cf范例: 这是一个小问题,但有时会不时出现错误……我不喜欢这样的事实,我什么都不用使用变量;) 问题答案: 我真的不会去理会这个额外的变量。但是,如果需要,也可以在使用后将其从内存中删除: 或者,您可以编写一个小函数: 并使用以下命令调用: 现在应该自动销毁该阵列。

  • 问题内容: 我如何遍历可变长度的Java数组。 我想我会设置一个while循环,但是如何检测到数组末尾。 我想我想要这样的东西[只需要弄清楚如何表示myArray.notEndofArray()] 问题答案: 要么 第二个版本是“ for-each”循环,它适用于数组和Collections。大多数循环可以使用for- each循环完成,因为您可能并不在乎实际的索引。如果您确实关心实际索引,请使用

  • 问题内容: 这个问题是关于 访问 数组和切片 元素 的速度,而不是关于将它们作为参数传递给函数的效率。 我希望在大多数情况下, 数组 比 切片 更快,因为切片是描述数组连续部分的数据结构,因此访问切片的元素(间接访问其基础数组的元素)时可能涉及额外的步骤。 因此,我编写了一个小测试来对一批简单操作进行基准测试。有4个基准测试功能,前两个测试一个 全局 切片和一个全局数组,其他两个测试一个 本地 切

  • 问题内容: 我想知道如何初始化整数数组,使其大小和值在程序执行过程中发生变化,有什么建议吗? 问题答案: 是的:使用ArrayList。 在Java中,“普通”数组是固定大小的。您必须给它们一个尺寸,并且不能扩展或收缩它们。要更改大小,您必须创建一个新数组并复制所需的数据-这效率低下,给您带来痛苦。 幸运的是,有许多内置类可以实现通用的数据结构以及其他有用的工具。您需要检查Java 6 API的完

  • 问题内容: 我有一个带有列的表,其中包含如下所示的字符串。 我需要从第二次出现到字符串结尾获取子字符串,并且您可以看到子字符串的长度不是固定的。第一部分并不总是固定的,它可以改变。到目前为止,我正在使用以下代码来实现它。 如您所见,我采用一个任意大的值作为长度来处理可变长度。有更好的方法吗? 问题答案: 您可以与函数结合使用,找到的最后一次出现,还可以使用从字符串末尾获取指定数量的字符。 SQLF

  • 我对访问中的数据的几种方法进行了比较。请参阅下面的结果。最快的访问是在上使用方法。在这篇文章中提到了我。 令我惊讶的是,通过访问比通过底层的 numpy 对象 访问更快。 我的问题是,有没有一种方法可以像我通过< code>get_value访问熊猫数据帧一样快速地访问numpy数组的元素? 10000个回路,最佳3:108µs/回路 最慢的运行时间是最快的5.42倍。这可能意味着正在缓存中间结果