Передача массивов фиксированного размера в С++?
В принципе, я хотел бы сделать что-то вроде этого:
int[3] array_func()
{
return {1,1,1};
}
int main(int argc,char * argv[])
{
int[3] point=array_func();
}
Но это не кажется законным в С++. Я знаю, что могу использовать векторы, но поскольку я знаю, что размер массива является константой, похоже, что потеря производительности может произойти.
Я также хотел бы избежать new
, если смогу, потому что выделить материал в стеке проще и, возможно, также повысить производительность.
Какое решение здесь?
Ответы
Ответ 1
Используя С++ 0x, почти завершенный новый стандарт С++ (уже реализованный в последних версиях gcc и msvc IIRC), вы можете сделать это именно так, как хотите! Просто используйте std:: array вместо int [3].
std::array<int, 3> array_func()
{
return {1,1,1};
}
int main(int argc,char * argv[])
{
std::array<int, 3> point = array_func();
}
Ответ 2
Поместите массив в структуру. boost::array
- такой пакет:
boost::array<int, 3> array_func() {
boost::array<int, 3> a = {{ 1, 1, 1 }};
return a;
}
int main() {
boost::array<int, 3> b = array_func();
}
Быстрая и грязная:
template<typename E, size_t S>
struct my_array {
E data[S];
};
Обратите внимание, как вы можете использовать синтаксис инициализации агрегата.
Ответ 3
Вы можете обернуть его в struct
, чтобы он возвращался по значению:
struct Vec3
{
float x[3];
}
Vec3 array_func()
{
Vec3 x = { 1.f, 1.f, 1.f };
return x;
}
Я не думаю, что вы можете использовать синтаксис инициализатора массива непосредственно в операторе return. Конечно, вы можете ввести конструктор (structs - это просто классы со всеми членами public, в конце концов):
struct Vec3
{
Vec3(a, b, c)
{
x[0] = a;
x[1] = b;
x[2] = c;
}
float x[3];
}
Vec3 array_func()
{
return Vec3(1.f, 1.f, 1.f);
}
Ответ 4
вы не можете вернуть массив фиксированного размера в С++. вы можете вернуть указатель на int (который будет использоваться как массив), но для этого потребуется выделить массив в куче, используя new
.
в любом случае вы можете передать свой массив в качестве аргумента вашей функции:
void array_func( int result[3])
{
result[0] = 1;
result[1] = 1;
result[2] = 1;
}
int main(int argc,char * argv[])
{
int point[3];
array_func( point );
}
однако, это больше похоже на C, чем на С++...
Ответ 5
boost:: array - это оболочка для массива на основе стека.
Обратите внимание, что распределение стека будет только дешевле, чем использование "нового", когда вам не нужно копировать большие массивы.