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)
请注意如何使用聚合初始化语法.
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)