关于返回课堂记忆的建议

Suggestions for returning memory from a class

本文关键字:记忆 课堂 于返回 返回      更新时间:2023-10-16

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

现在我需要创建一个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+签名,我只得到一个浮点指针

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

如果能返回一个智能指针或类似的东西,我可以很容易地将其内存"连接"到其他元素,这样我就可以安全地将这些东西传递给OpenGL。

CppCoreGuidelines引入了span,它是连续元素的视图,因此您可以使用以下内容:

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

表达意愿。