我正在研究一些核心音频代码,并且有一个问题可以通过结构中的变量数组来解决 - 一个灵活的数组成员。在进行一些调查时,我发现有很多关于Flexible Member Arrays的可移植性和可行性的对话。
据我所知,Objective-C符合C99标准。因此,我认为灵活阵列成员应该是一个很好的解决方案。我也看到灵活阵列成员在C ++中不是一个好主意。
在Objective-C ++中做什么?从技术上讲,我不会在Objective-C ++中使用它。我正在编写基于C和C ++的回调......这似乎是一个反对的观点。
无论如何,我(我应该)可以这样做吗?如果没有,是否有另一种技术具有相同的结果?
答案 0 :(得分:1)
你总是可以声明一个大小为1的尾随数组。在最坏的情况下,你浪费了相当少的内存,而且为malloc计算正确的大小会稍微复杂一些。
答案 1 :(得分:0)
更新
我想要一个音符开始时间列表(uint64_t)并迭代它们以查看正在播放的音量(如果有的话)。我打算在struct中添加一个count var来跟踪灵活数组中有多少项。
好的,如果你有固定的复音,那么固定大小的数组应该没问题。在大多数iOS合成器中你不需要多个这样的数组。当然,'即将发布的音符'数组大小可能因app合成而异吗?取样?序?现场投入?
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);
如果你需要一个非常大的动态大小的数组,那么使用一个向量。如果你只需要一个这样的实例,并且最大复数是(比方说)64,那么就使用它。