std::vector
использует кучу. Черт возьми, что за пустая трата времени - просто ради проверки работоспособности. Точка std::vector
- динамический рост во время выполнения, а не любая старая проверка синтаксиса, которая должна выполняться во время компиляции. Если вы не собираетесь расти, создайте класс для переноса обычного массива.
#include <stdio.h>
template <class Type, size_t MaxLength>
class ConstFixedSizeArrayFiller {
private:
size_t length;
public:
ConstFixedSizeArrayFiller() : length(0) {
}
virtual ~ConstFixedSizeArrayFiller() {
}
virtual void Fill(Type *array) = 0;
protected:
void add_element(Type *array, const Type & element)
{
if(length >= MaxLength) {
// todo: throw more appropriate out-of-bounds exception
throw 0;
}
array[length] = element;
length++;
}
};
template <class Type, size_t Length>
class ConstFixedSizeArray {
private:
Type array[Length];
public:
explicit ConstFixedSizeArray(
ConstFixedSizeArrayFiller<Type, Length> & filler
) {
filler.Fill(array);
}
const Type *Array() const {
return array;
}
size_t ArrayLength() const {
return Length;
}
};
class a {
private:
class b_filler : public ConstFixedSizeArrayFiller<int, 2> {
public:
virtual ~b_filler() {
}
virtual void Fill(int *array) {
add_element(array, 87);
add_element(array, 96);
}
};
const ConstFixedSizeArray<int, 2> b;
public:
a(void) : b(b_filler()) {
}
void print_items() {
size_t i;
for(i = 0; i < b.ArrayLength(); i++)
{
printf("%d\n", b.Array()[i]);
}
}
};
int main()
{
a x;
x.print_items();
return 0;
}
ConstFixedSizeArrayFiller
и ConstFixedSizeArray
могут использоваться повторно.
Первый позволяет проверять границы во время выполнения при инициализации массива (так же, как мог бы вектор), который позже может стать const
после этой инициализации.
Второй позволяет массиву быть размещенным внутри другого объекта, который может находиться в куче или просто в стеке, если он находится там, где находится объект. Там нет траты времени на выделение из кучи. Он также выполняет проверку констант во время компиляции массива.
b_filler
- это крошечный закрытый класс для предоставления значений инициализации. Размер массива проверяется во время компиляции с помощью аргументов шаблона, поэтому нет шансов выйти за пределы.
Я уверен, что есть более экзотические способы изменить это. Это начальный удар. Я думаю, что вы можете в значительной степени восполнить любой недостаток компилятора с классами.