Kah*_*ler 9 c++ reference dereference c++11 semantics
我想迭代一个预先分配的浮点数组,该数组包含一个不拥有数据的自定义容器,但是对它的一部分起作用.例如,命名容器类LinhaSobre:
std::unique_ptr<float[]> data(new float[720]);
...
//creates container to iterate 26 floats starting from from data[12]
LinhaSobre cont(data.get()+12, 26);
//sets those elements to 1.5
for(size_t i = 0; i < cont.size(); i++)
cont[i] = 1.5f;
Run Code Online (Sandbox Code Playgroud)
这是一个可能的实现operator[]:
//...
//LinhaSobre has a member mem0 which is initialized
//as a pointer to where the interval starts
float & LinhaSobre::operator[] (size_t i)
{
return *(mem0+i);
}
Run Code Online (Sandbox Code Playgroud)
请注意,我正在返回LinhaSobre::operator[]它不拥有的数据的引用.它不应该干扰数据的生命周期(构造函数,析构函数).
现在我想暴露data另一种模式存储的std::array<float,4>,而不是纯粹的float.例如,命名新类LinhaSobre4f:
std::unique_ptr<float[]> data(new float[720]);
...
//creates container to iterate 4 array<float, 4> starting from from data[12]
LinhaSobre4f l(data.get()+(3*4), 4);
//sets those elements to {1.5f, 2.5f, 3.5f, 4.5f};
for(size_t i = 0; i < l.size(); i++)
l[i] = { {1.5f, 2.5f, 3.5f, 4.5f} };
Run Code Online (Sandbox Code Playgroud)
请注意,我将项目视为数组.这会导致容器类的一些变化,我主要关心的是operator[],这里是完整的类代码:
struct LinhaSobre4f
{
LinhaSobre4f(float * pos_begin, size_t size_):
pos0(pos_begin),
size_(size_){}
std::array<float, 4> & operator[](size_t i)const
{
std::array<float,4> * r =
reinterpret_cast<std::array<float,4>*> (pos0+(4*i));
return *r;
}
size_t size()const
{
return size_;
}
private:
float * pos0;
size_t size_;
};
Run Code Online (Sandbox Code Playgroud)
在operator[]作为一个处理一个内存块的基准收益std::array<float,4>是根本不存在这样,但考虑到std::array内存布局担保,它的工作原理.我对此持怀疑态度,可以吗?(除了记忆对齐,我保证).我是否允许在语义上暴露这样的物体?这个的正确用语是什么?(我在标题中使用了假对象).
C++标准(我正在阅读C++ 11)定义std::array如下:
应满足总量(8.5.1)的条件.
您不能保证a std::array是POD.C++标准仅保证它是类聚合.
基于此,我相信您reinterpret_cast将floats 的POD数组转换为a的用法std::array是未定义的行为.
有可能它会与您的编译器一起工作,但您不能保证这将是可移植的或合法的.