从 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]);
但是这种方法有两个问题:
- 我需要相信调用者已分配内存来存储 10 个浮点数
- 没有 C++11+ 签名,我只是得到一个浮点指针
我不能只 return 一个 std::unique_ptr
因为我需要一个连续的内存区域 (buffer
) 来存储元素,但我还需要区分不同的元素(这也会使代码更具可读性)。
最好 return 一个智能指针或类似的东西,我可以很容易地 "concatenate" 将其内存 "concatenate" 给其他元素,这样我就可以安全地将这些东西传递给 OpenGL。
CppCoreGuidelines 引入了 span
这是一个 view 的连续元素,所以你可以使用类似的东西:
void writeData(gsl::span<float, 10> ptrToMemory)
表达意图。
我有一个 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]);
但是这种方法有两个问题:
- 我需要相信调用者已分配内存来存储 10 个浮点数
- 没有 C++11+ 签名,我只是得到一个浮点指针
我不能只 return 一个 std::unique_ptr
因为我需要一个连续的内存区域 (buffer
) 来存储元素,但我还需要区分不同的元素(这也会使代码更具可读性)。
最好 return 一个智能指针或类似的东西,我可以很容易地 "concatenate" 将其内存 "concatenate" 给其他元素,这样我就可以安全地将这些东西传递给 OpenGL。
CppCoreGuidelines 引入了 span
这是一个 view 的连续元素,所以你可以使用类似的东西:
void writeData(gsl::span<float, 10> ptrToMemory)
表达意图。