关于返回课堂记忆的建议
Suggestions for returning memory from a class
我有一个类,它应该保存像素数据(位置浮动,颜色浮动)。我试图在数据成员中使用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]);
但是这种方法有两个问题:
- 我需要相信调用者已经分配了内存来存储10个浮点值
- 没有C++11+签名,我只得到一个浮点指针
我不能只返回一个std::unique_ptr
,因为我需要一个连续的存储区(buffer
)来存储元素,但我还需要区分不同的元素(这也会使代码更可读)。
如果能返回一个智能指针或类似的东西,我可以很容易地将其内存"连接"到其他元素,这样我就可以安全地将这些东西传递给OpenGL。
CppCoreGuidelines引入了span
,它是连续元素的视图,因此您可以使用以下内容:
void writeData(gsl::span<float, 10> ptrToMemory)
表达意愿。
相关文章:
- 松弛原子与无同步情况下的记忆连贯性
- 递归函数有效,但无法记忆
- 如何将记忆应用于此递归函数?
- 共享记忆:让我们谈谈它的特殊性
- 为什么nlohmann不释放记忆
- CPP 中的瓦尔格林德和记忆泄漏:"Conditional jump or move depends on uninitialised values"
- C++17 多态记忆资源不起作用
- 我是否漏了记忆?
- 关于记忆后这种递归关系的时间复杂度
- 记忆栅栏和记忆屏障是一样的吗
- 使用记忆在 C++ 中实现 Knapstack
- 无论如何可以将webm / mp4文件编译/记忆为.exe程序吗?(C++)
- 如何在硬币兑换中添加记忆
- 动态记忆的删除是如何真正起作用的
- 如何在课堂上重用和重新初始化 c++ discrete_distribution?
- 在课堂上创建了一个朋友,给出"无输入文件"错误
- C++遗传,记忆问题
- 使用未声明的标识符"nothrow";你是说"扔"吗?记忆
- 当记忆分配给课堂时
- 关于返回课堂记忆的建议