Подтвердить что ты не робот

Передача массивов фиксированного размера в С++?

В принципе, я хотел бы сделать что-то вроде этого:

int[3] array_func()
{
    return {1,1,1};
}

int main(int argc,char * argv[])
{
    int[3] point=array_func();
}

Но это не кажется законным в С++. Я знаю, что могу использовать векторы, но поскольку я знаю, что размер массива является константой, похоже, что потеря производительности может произойти. Я также хотел бы избежать new, если смогу, потому что выделить материал в стеке проще и, возможно, также повысить производительность.

Какое решение здесь?

4b9b3361

Ответ 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 - это оболочка для массива на основе стека.

Обратите внимание, что распределение стека будет только дешевле, чем использование "нового", когда вам не нужно копировать большие массивы.