objective - c++中iOS上的灵活数组成员
Flexible Array Members on iOS in Objective-C++
我正在研究一些核心音频代码,并有一个问题,可以通过一个结构体中的变量数组来解决——一个灵活的数组成员。在做了一些环顾四周,我看到有很多关于灵活成员数组的可移植性和可行性的对话。
据我所知,Objective-C是C99兼容的。出于这个原因,我认为灵活的数组成员应该是一个很好的解决方案。我也看到灵活数组成员在c++中不是一个好主意。
在objective - c++中做什么?技术上讲,我不会在objective - c++中使用它。我正在编写基于C和c++的回调函数…这似乎是一个反对的观点。
不管怎样,我能(应该)做这件事吗?如果没有,是否有其他方法可以达到同样的效果?总是可以声明大小为1的尾部数组。在最坏的情况下,您浪费了相当少的内存,并且计算malloc的正确大小稍微复杂一些。
不用麻烦了。它不兼容。它很混乱而且容易出错。早在这个特性出现之前,c++就有了更容易管理的解决方案。你在结构体的末端添加了什么?通常,您只需要使用std::vector、std::array或固定大小的数组。
更新我想有一个列表的注意开始时间(uint64_t),并通过它们迭代,看看哪一个,如果有的话,正在播放。我将在结构体中添加一个count变量,以跟踪灵活数组中有多少项。
好的,那么一个固定大小的数组应该是好的,如果你有固定的复调。在大多数iOS synths中,你不需要超过一个这样的数组。当然,"即将到来的笔记"数组的大小可能会根据应用的synth而有所不同。取样器吗?定序器吗?住输入吗?
template <size_t NumNotes_>
class t_note_start_times {
public:
static const size_t NumNotes = NumNotes_;
typedef uint64_t t_timestamp;
/*...*/
const t_timestamp& timestampAt(const size_t& idx) const {
assert(this->d_numFutureNotes <= NumNotes);
assert(idx < NumNotes);
assert(idx < this->d_numFutureNotes);
return this->d_startTimes[idx];
}
private:
t_timestamp d_presentTime;
size_t d_numFutureNotes; // presumably, this will be the number of active notes,
// and values will be compacted to [0...d_numFutureNotes)
t_timestamp d_startTimes[NumNotes];
};
// in use
const size_t Polyphony = 16;
t_note_start_times<Polyphony> startTimes;
startTimes.addNoteAtTime(noteTimestamp); // defined in the '...' ;)
startTimes.timestampAt(0);
如果你需要一个动态大小的数组,它可能非常大,那么使用vector。如果你只需要这个的一个实例,并且最大复调是(比如说)64,那么就使用这个。
相关文章:
- 为什么我无法访问指向数组中成员函数的指针?
- 如何将结构/联合数组的成员传递到函数中
- 使用带有参数包的数组的成员数组初始化类
- 有没有办法给数组的成员指定不同的名称?
- 使用包含结构的数组的成员函数
- C++:释放动态数组(结构成员)和指向此结构的指针的方法
- C 用数组作为成员创建对象
- 用另一个 constexpr 数组对成员数组进行大括号初始化
- 来自数组的成员和比特菲尔德的结构
- 如何创建指向数组类成员的指针?
- 将数组的成员设置为零
- "Empty"数组\向量成员 C++
- 功能指针数组(包括成员功能)投掷模板专业化错误
- 另一个结构内部的结构数组的成员变量没有通过引用传递
- 正确转换 2D 数组的成员变量
- 常量数组类成员初始化
- 为具有对象或对象数组作为成员的类运行不同的代码
- C++ 如何指向数组的成员
- 将包含数组数据成员的结构保存到文件
- 数组类成员初始化(C++)