iOS-Objective ++中的灵活数组成员

时间:2011-04-08 16:37:49

标签: c++ c core-audio objective-c++ flexible-array-member

我正在研究一些核心音频代码,并且有一个问题可以通过结构中的变量数组来解决 - 一个灵活的数组成员。在进行一些调查时,我发现有很多关于Flexible Member Arrays的可移植性和可行性的对话。

据我所知,Objective-C符合C99标准。因此,我认为灵活阵列成员应该是一个很好的解决方案。我也看到灵活阵列成员在C ++中不是一个好主意。

在Objective-C ++中做什么?从技术上讲,我不会在Objective-C ++中使用它。我正在编写基于C和C ++的回调......这似乎是一个反对的观点。

无论如何,我(我应该)可以这样做吗?如果没有,是否有另一种技术具有相同的结果?

2 个答案:

答案 0 :(得分:1)

你总是可以声明一个大小为1的尾随数组。在最坏的情况下,你浪费了相当少的内存,而且为malloc计算正确的大小会稍微复杂一些。

答案 1 :(得分:0)

不要打扰。它不兼容。它很混乱,容易出错。 c ++拥有在此功能存在之前很久就能够轻松管理的解决方案。你在结构的最后得到了什么?通常,你只需使用类似std :: vector,std :: array或固定大小的数组。

更新

  

我想要一个音符开始时间列表(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,那么就使用它。

相关问题