objective - c++中iOS上的灵活数组成员

Flexible Array Members on iOS in Objective-C++

本文关键字:数组 组成员 c++ iOS objective      更新时间:2023-10-16

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

据我所知,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,那么就使用这个。