从 class 返回内存的建议

Suggestions for returning memory from a class

我有一个 class 应该保留像素数据(位置浮动,颜色浮动)。我正在尝试在数据成员中使用 C++ 样式(数据保存在 std::array<float, N> 而不是普通的 C 数组中)。 class 具有其他 getter、setter 和函数,旨在 "helpers" 来填充这些字段。

现在我需要创建一个 OpenGL 顶点数据缓冲区,我应该在其中写出

  4 floats for xyzw
  4 floats for rgba
  2 floats for UV coords

依此顺序。我想知道我应该怎么做。我试过

class MyVertexData {
  std::array<float, 4> pos;
  std::array<float, 4> rgba;
  std::array<float, 2> uv;
public:
  void writeData(float *ptrToMemory) {
    if(ptrToMemory == nullptr)
      throw std::runtime_exception("Null pointer");

    std::array<float, 10> output;

    output= {
      pos[0], pos[1], pos[2], pos[3],
      rgba[0], rgba[1], rgba[2], rgba[3],
      uv[0], uv[1]
    };

    memcpy(memory, out.data(), 10 * sizeof(float));
  }
};


// Caller code
std::vector<float[10]> buffer(4);
vertex0.writeElements(buffer[0]);
vertex1.writeElements(buffer[1]);
vertex2.writeElements(buffer[2]);
vertex3.writeElements(buffer[3]);

但是这种方法有两个问题:

  1. 我需要相信调用者已分配内存来存储 10 个浮点数
  2. 没有 C++11+ 签名,我只是得到一个浮点指针

我不能只 return 一个 std::unique_ptr 因为我需要一个连续的内存区域 (buffer) 来存储元素,但我还需要区分不同的元素(这也会使代码更具可读性)。

最好 return 一个智能指针或类似的东西,我可以很容易地 "concatenate" 将其内存 "concatenate" 给其他元素,这样我就可以安全地将这些东西传递给 OpenGL。

CppCoreGuidelines 引入了 span 这是一个 view 的连续元素,所以你可以使用类似的东西:

void writeData(gsl::span<float, 10> ptrToMemory)

表达意图。