Возврат указателя с плавающей точкой на данные вектора символов, считанные из файла - PullRequest
0 голосов
/ 20 января 2012

Данные в Resource читаются из кулачка с использованием read, и поскольку 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 Ответ

1 голос
/ 21 января 2012

Стандарт C ++ ничего не говорит об этом: экстернализация объектов, даже встроенных типов, и их обратное чтение могут работать или не работать.На практике это имеет тенденцию работать с этим, как правило, с плохой идеей: то, что начинается с быстрого способа делать вещи, часто быстро используется во многих местах (в конце концов, это «работает») и эффективно ограничивает использование подхода одной платформой.Я работал не только над проектом, где существует сильная зависимость от 32-битных слов с определенным порядком байтов.Тот факт, что современная система имеет тенденцию к 64-битным словам и популярным (и, следовательно, дешевым и мощным) процессорам, отличным от Endianess, фактически означает, что эти проекты ограничены относительно дорогими машинами, которые в дополнение к этому используются для работы в режиме 32-битной совместимости.

Тем не менее, это работает на практике, несмотря на то, что стандартная записка действительно дает какие-либо гарантии.Тем не менее, выбранный вами подход ограничен , а не , чтобы работать слишком хорошо: фактически нет ограничений на выравнивание на char, т. Е. std::vector<char> может выделить память и удачно поставить, например, 32-битное слово передоб этом, если не что иное для собственного развлечения.Это будет означать, что слова, которые вы хотите загрузить, не выровнены должным образом и либо не будут загружены вообще, либо будут загружены в замедленном режиме.То есть вы хотите, чтобы ваши std::vector<T> содержали объекты с максимальным требованием выравнивания (например, какое-нибудь 16-байтовое слово, чтобы справиться со 128-битными словами) и приводили адрес к этому типу в char.Это, конечно, все еще означает, что данные должны быть выгружены в том же формате, который используется на компьютере.Если возможно, я бы постарался избежать такого подхода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...