基本上我想做这样的事情:
int[3] array_func()
{
return {1,1,1};
}
int main(int argc,char * argv[])
{
int[3] point=array_func();
}
但这在 C++ 中似乎不合法。我知道我可以使用向量,但由于我知道数组的大小是一个常数,因此似乎很可能会出现性能损失。如果可以的话,我也想避免new
,因为在堆栈上分配东西更容易,也可能提高性能。
这里有什么解决方案?
基本上我想做这样的事情:
int[3] array_func()
{
return {1,1,1};
}
int main(int argc,char * argv[])
{
int[3] point=array_func();
}
但这在 C++ 中似乎不合法。我知道我可以使用向量,但由于我知道数组的大小是一个常数,因此似乎很可能会出现性能损失。如果可以的话,我也想避免new
,因为在堆栈上分配东西更容易,也可能提高性能。
这里有什么解决方案?
使用几乎完成的新 C++ 标准 C++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();
}
将数组放入结构中。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];
};
请注意如何使用聚合初始化语法。
您可以将其包装在, 中struct
,使其可按值返回:
struct Vec3
{
float x[3];
}
Vec3 array_func()
{
Vec3 x = { 1.f, 1.f, 1.f };
return x;
}
我认为您不能直接在 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);
}
您不能在 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++...
boost::array是基于堆栈的数组的包装器。
请注意,当您不必复制大型数组时,堆栈分配只会比使用“新”便宜。