C++ 返回向量对象的引用,好主意?

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

我需要一个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];
}
...
结构内部的

...
矢量数据;
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;