C++ 在C++;
我面临以下问题。我想制作一个模板化函数,它可以处理尽可能多的结构,但它有一个限制,即它需要能够将所有数据连续复制到缓冲区中C++ 在C++;,c++,templates,memory,memory-management,buffer,C++,Templates,Memory,Memory Management,Buffer,我面临以下问题。我想制作一个模板化函数,它可以处理尽可能多的结构,但它有一个限制,即它需要能够将所有数据连续复制到缓冲区中 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]; 例如: struct A{ int foo; int bar;
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];
例如:
struct A{
int foo;
int bar;
}
应该成为一个8字节的缓冲区
struct B{
int foo;
vector<int> bar;
}
B.bar = vector<int>(2);
结构B{
int foo;
矢量条;
}
B.bar=向量(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];
int*buffer=(int*)malloc(sizeof(int)+sizeof(int)*bar.size();
缓冲区[0]=foo;
对于(inti=0;i在帖子中,你说
我想制作一个模板函数,它可以处理尽可能多的结构
你在评论中说,
我正在为OpenGL SSBO编写一个包装器,因此我需要将数据作为一个连续的数据包传递给GPU。此函数的用例是能够压缩数据并将其传递给GPU
目标是有道理的。使用函数模板实现目标的策略可能并不正确
使用重载函数可能是最好的选择
using BufferData = std::vector<char>;
BufferData toBufferData(A const& a);
BufferData toBufferData(B const& b);
使用BufferData=std::vector;
BufferData转换为BufferData(常数A);
缓冲数据到缓冲数据(B常量和B);
我可以调用malloc()分配12个字节并手动将数据复制到此缓冲区。--从而丢弃你的向量
对象。应该成为12个字节的缓冲区。--你的函数模板的动机是什么?用例是什么?@PaulMcKenzie我看不出你的代码的相关性。有3个整数假设每个都是4个字节,最后一个buffrs大小需要为12字节。您拥有的是结构的大小,在这种情况下,无论向量大小如何,结构的大小始终是32字节,因为向量的大小是24字节。在这种情况下,int的大小是8字节。您的示例与我的问题无关,std::vector存储元数据(包括指向数据的指针)但它不直接存储数据,如果我将实际数据复制到内存中的一个连续区域,则实际数据将被删除copied@RSahu我正在为OpenGL SSBO编写一个包装器,因此我需要将数据作为一个连续的数据包传递给GPU。此函数的用例是能够压缩数据并将其传递给然而,GPUThis策略要求每个要处理的新结构都有一个重载函数,如果可能的话,这是我想要避免的。@Makogan,这是一个崇高的目标,但我认为除了简单的POD类型之外,你无法实现这一目标。即使是struct
s有对齐填充的结构也会是一个问题。这是吗有一种方法可以创建一个模板函数,强制其成员实现java中的接口?@Makogan,当然。void template foo(T const&T){T.bar();}
只有在T
有一个成员函数bar()
时才能工作。我假设这是一个编译时检查,对吗?