0

我正在研究一些核心音频代码,并且有一个问题可以通过结构中的变量数组来解决 - 即灵活数组成员。环顾四周,我发现有很多关于灵活成员阵列的可移植性和可行性的对话。

据我了解,Objective-C 符合 C99。出于这个原因,我认为灵活数组成员应该是一个很好的解决方案。我还看到灵活数组成员在 C++ 中不是一个好主意。

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

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

4

2 回答 2

1

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

于 2011-04-08T17:14:14.893 回答
0

不要打扰。它不兼容。它很混乱且容易出错。早在此功能存在之前,c++ 就有更容易管理的解决方案。您在结构的末尾添加了什么?通常,您只需使用 std::vector、std::array 或固定大小数组之类的东西。

更新

我想要一个音符开始时间列表(uint64_t)并遍历它们以查看正在播放的(如果有的话)。我打算在结构中添加一个计数变量来跟踪灵活数组中有多少项目。

好的,如果您有固定的复音,那么固定大小的数组应该没问题。在大多数 iOS 合成器中,您不需要多个这样的数组。当然,“即将到来的笔记”数组大小可能会因应用合成器而异?采样器?定序器?现场输入?

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,那么就使用它。

于 2011-04-08T17:48:00.073 回答