将float指针返回到从文件读取的char矢量数据

时间:2012-01-20 19:43:19

标签: c++ casting io

资源中的数据是使用read从headream中读取的,因为read需要一个char数组,我将它存储在一个向量中。当我将数据加载到GPU上时,我只需要指向数据的char指针..但是例如。如果我需要计算顶点缓冲区的边界框,我需要将数据作为浮点数...这是一个好方法吗?我应该在GetDataChar()中返回对向量的引用吗?

class Resource
{
protected:
    const std::vector<char>& GetDataRef() const
    {
        return m_data;
    }
private:
    std::vector<char> m_data;
}

class VertexBuffer : public Resource
{
public:
    const char* GetDataChar() const
    {
        return &GetDataRef()[0];
    }

    const float* GetDataFloat() const
    {
        return reinterpret_cast<float*>(&GetDataRef()[0]);
    }
}

class IndexBuffer : public Resource
{
public:
    const char* GetDataChar() const
    {
        return &GetDataRef()[0];
    }

    const int* GetDataInt() const
    {
        return reinterpret_cast<int*>(&GetDataRef()[0]);
    }
}

1 个答案:

答案 0 :(得分:1)

C ++标准并没有真正说明这一点:外部化对象,甚至内置类型,以及读取它们可能有效或无效。在实践中,它通常会解决它通常是一个坏主意:什么开始快速做事通常很快就会在许多地方使用(毕竟它&#34;工作&#34;)并有效地限制了方法的使用一个平台。我的工作不仅仅是项目,因为32位词具有一定的Endianess。事实上,当代系统倾向于64位字和流行(因而便宜且功能强大)的CPU,不同的Endianess有效地意味着这些项目仅限于相对昂贵的机器,它们被滥用以在32位兼容模式下运行。 / p>

尽管如此,尽管标准说明确实有任何保证,但它仍在实践中运作。但是,您选择的方法绑定工作得太好:char实际上没有对齐约束,即std::vector<char>可以分配内存和快乐放置,例如在它前面有一个32位的字,如果没有其他的自己的娱乐。这意味着您要加载的单词未正确对齐,或者根本无法加载或者以慢动作加载。也就是说,您希望std::vector<T>保持具有最大对齐要求的对象(例如,一些16字节的字来处理128位字)并将该地址转换为char。当然,这仍然意味着需要以与机器上使用的格式完全相同的方式转储数据。如果可能的话,我会尽量避免这种做法。