Передача массивов фиксированного размера в C ++? - PullRequest
14 голосов
/ 18 ноября 2009

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

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

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

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

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

Ответы [ 5 ]

21 голосов
/ 18 ноября 2009

Поместите массив в структуру. 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];
};

Обратите внимание, как вы можете использовать синтаксис агрегатной инициализации.

18 голосов
/ 18 ноября 2009

Используя C ++ 0x, практически завершенный новый стандарт C ++ (уже реализованный в последних версиях 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();
}
18 голосов
/ 18 ноября 2009

Вы можете обернуть его в struct, чтобы сделать его возвращаемым по значению:

struct Vec3
{
  float x[3];
}

Vec3 array_func()
{
  Vec3 x = { 1.f, 1.f, 1.f };

  return x;
}

Я не думаю, что вы можете использовать синтаксис инициализатора массива непосредственно в операторе возврата. Конечно, вы могли бы представить конструктор (в конце концов, структуры - это просто классы со всеми открытыми членами):

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);
}
2 голосов
/ 18 ноября 2009

вы не можете вернуть массив фиксированного размера в C ++. Вы можете вернуть указатель на 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, чем на C ++ ...

0 голосов
/ 18 ноября 2009

boost :: array - это оболочка для стекового массива.

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

...