Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C++;_C++_Templates_Memory_Memory Management_Buffer - Fatal编程技术网

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()
时才能工作。我假设这是一个编译时检查,对吗?