C++ 中连续内存中的模板化不同大小的结构

Templated varying size structures in contiguous memory in C++

本文关键字:结构 连续 内存 C++      更新时间:2023-10-16

我面临以下问题。我想创建一个可以处理尽可能多的结构的模板化函数,但它附带的限制是它需要能够将所有数据连续复制到缓冲区中。

所以例如:

struct A{
int foo;
int bar;
}

应该成为 8 个字节的缓冲区。

struct B{
int foo;
vector<int> bar;
}
B.bar = vector<int>(2);

应该成为 12 个字节的缓冲区。

对于 B 的情况,如果我已经知道 B 的样子,我可以调用 malloc(( 来分配 12 个字节并将数据手动复制到这个缓冲区中。

有没有办法通过模板来实现这一点,或者我是否需要添加限制,即提供给我的模板化函数的任何结构都必须已经连续存储?

编辑:

这就是我所说的将 B 的数据复制到缓冲区的意思。

int *buffer = (int*) malloc(sizeof(int)+sizeof(int)*bar.size());
buffer[0] = foo;
for(int i=0; i<B.bar.size(), i++)
buffer[i+1]=B.bar[i];

在帖子中,你说,

我想制作一个可以处理尽可能多的结构的模板化函数

在评论中你说,

我正在为 OpenGL SSBO 编写一个包装器,因此我需要将数据作为连续数据包传递给 GPU。此功能的用例是能够通常压缩数据并将其传递给GPU

目标是有道理的。使用函数模板实现目标的策略可能不是正确的策略。

使用重载函数可能是您的最佳选择。

using BufferData = std::vector<char>;
BufferData toBufferData(A const& a);
BufferData toBufferData(B const& b);