C++ 返回向量对象的引用,好主意?
我需要一个3d矢量来存储一些平铺对象,而不是将矢量放在矢量中,我尝试了以下方法:C++ 返回向量对象的引用,好主意?,c++,C++,我需要一个3d矢量来存储一些平铺对象,而不是将矢量放在矢量中,我尝试了以下方法: inside a struct ... vector<sortTile3> data; uint32_t width, length, height; sortTile3& At(uint32_t x, uint32_t y, uint32_t z) { return data[x * width + y * length + z]; } ... 结构内部的 ... 矢量数据; ui
inside a struct
...
vector<sortTile3> data;
uint32_t width, length, height;
sortTile3& At(uint32_t x, uint32_t y, uint32_t z) {
return data[x * width + y * length + z];
}
...
结构内部的
...
矢量数据;
uint32_t宽度、长度、高度;
sortTile3和At(uint32_t x、uint32_t y、uint32_t z){
返回数据[x*宽度+y*长度+z];
}
...
似乎工作得很好,也应该更快,我想,因为它不是3次内存提取,而是1次内存提取和4次计算,或者2次计算,如果我能想出如何进行融合乘法加法的话
不管怎么说,我记得在这个网站上读到了一些关于返回引用是不好的东西。我明白为什么。。很多事情可能会出错,但这一点不应该是这样。或者?如果引用被存储(而不仅仅是临时使用),则可能会出现问题。当
向量
重新分配内存或向量
中的项目被移动(插入
)或向量
被删除时,引用将失效。如果存储这些引用后不再修改向量
,则该向量将是安全的
请参阅关于迭代器无效的 这很正常。返回引用的问题主要涉及函数本地对象。也就是说:
struct foo {
int data;
// this is fine
int &ref1() {
return data;
}
// this is NOT fine
int &ref2() {
int localdata;
return localdata;
}
}
后者不好的原因是localdata
在离开foo::ref2
时超出范围,然后返回的引用将不会引用有效的对象
通常,您必须注意不要将对对象的引用保留超过其生存期,但是从成员函数返回对数据成员的引用本身并没有什么错误
例如,您可能已经注意到std::vector
的操作符[]
返回对其成员的引用;你也可以做同样的事。但是,您必须小心,不要将它们存储的时间超过它们保持有效的时间。例如:
std::vector<int> v(10);
int &r = v[0];
v.resize(20);
// r is no longer valid because v may have relocated its storage.
如果您有零钱,返回副本对您没有用处。这在很大程度上取决于环境。只要管理结构的生命周期,向量就可以生存。但这可能会变得很难维护。如果您的结构表示事物的容器,则返回对所包含事物的引用是完全正确的。只有当对象的生存期太短而不可用、未知或不清楚时,返回对对象的引用才是不好的。对于类似容器的对象,这些都不是问题。我只是做了一些性能测试,它看起来确实更快,如果只是499ms比515ms(超过10亿次赋值和回迁迭代)的微小差距,那么指针的情况不也是这样吗?有人可能会保持死指针不变。我认为对于
std::vector
,元素的引用、指针和迭代器具有相同的行为。
yourstruct.At(0, 1, 2).foo = bar;