在C++中传递固定大小的数组?

sta*_*tti 15 c++ performance numerical allocation

基本上我想做那样的事情:

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

int main(int argc,char * argv[])
{
    int[3] point=array_func();
}
Run Code Online (Sandbox Code Playgroud)

但这在C++中似乎不合法.我知道我可以使用向量,但是因为我知道数组的大小是常数,所以似乎可能会发生性能损失.new如果可以的话,我也想避免使用,因为在堆栈上分配东西更容易,也可能提高性能.

这里有什么解决方案?

Joh*_*itb 21

将数组放入结构中.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();
}
Run Code Online (Sandbox Code Playgroud)

又快又脏:

template<typename E, size_t S>
struct my_array {
  E data[S];
};
Run Code Online (Sandbox Code Playgroud)

请注意如何使用聚合初始化语法.

  • @KomodoDave我建议低估错误的答案,以及那些没有真正回答问题的答案.这个答案对我来说似乎没问题. (3认同)

Did*_*set 19

使用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();
}
Run Code Online (Sandbox Code Playgroud)


unw*_*ind 18

您可以将其包装在a中struct,以使其按值返回:

struct Vec3
{
  float x[3];
}

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

  return x;
}
Run Code Online (Sandbox Code Playgroud)

我认为你不能直接在return语句中使用数组初始化器语法.当然你可以引入一个构造函数(结构只是所有成员公开的类,毕竟):

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);
}
Run Code Online (Sandbox Code Playgroud)

  • 我选择它作为最好的答案,因为它回答了我的问题,简单明了,没有推动我没有要求的库.不是litb的答案很糟糕,我只是发现放松的答案更清楚了. (7认同)
  • 这将是最好的答案,除了这样的结构已经存在:http://stackoverflow.com/questions/1755000/1755017#1755017 (4认同)
  • "...推动我没有要求的图书馆......"好吧,我们在这里谈论_boost_,而不仅仅是一些图书馆.无论如何,你的标准lib实现很可能带有`std :: tr1 :: array`(C++ 03或TR1)甚至`std :: array`(C++ 1x),这是完全一样的.(这表明提升不仅仅是另一个库.它是下一个C++标准的测试平台,由标准委员会成员创建,正是出于这个原因,它具有非常高的质量标准和高要求的评论,并且它贡献了很多东西到下一个标准库.) (3认同)
  • @sbi这里完全不需要使用boost,并且建议使用库比使用标准语言功能更可取,特别是当后者需要少得多的击键时,这是荒谬的. (3认同)