使用char数组来保存一个任意大小的对象数组,对齐问题?

时间:2011-06-17 17:32:29

标签: c++ odbc

我想将一个参数数组传递给SQLBindParameters,并将此数组保存在char数组中(因为我事先不知道该类型)(我希望'array'中的所有元素都是相同的)。

我将有一个指向样本参数类型的指针,以及参数的大小。

void *buffer = getBuffer();
int bufferLength = getBufferLength();
const int numElements = 200; //for example

char *array = new char[bufferLength * numElements];

for(int i=0; i < numElements; ++i)
{
    memcpy(array + (i * bufferLength), buffer, bufferLength)
}

// now use array in SQLBindParameter call    

这会按预期工作,没有任何对齐问题吗? (就像我刚刚宣布一个正确类型的数组一样开始)

3 个答案:

答案 0 :(得分:1)

vector只是一个动态分配内存的连续块的包装器,换句话说就是一个数组。因此,如果此程序适用于使用mallocnew分配的数组,则应继续使用vector

(当然,除非它只是“意外地”使用数组,但vector不太可能引入额外的问题。)

答案 1 :(得分:1)

假设您正在使用vector与分配器一起使用operator new,那么C ++标准保证分配有char的{​​{1}}数组将会适当对齐以用于任何数据类型。

编辑:是的,保证new可以与任何类型一起使用。

EDIT2:请注意本地(堆栈)数组new char[]没有这样的对齐保证。

答案 2 :(得分:0)

23.2.4 中的C ++标准保证了向量&lt;&gt;的每个元素。连续存储:

  

a的元素   向量是连续存储的,这意味着如果v是一个向量,其中T是某种类型   除了bool之外,它对于所有0&lt; = n&lt;所有0&lt; = n&lt;&lt; = n&lt;&lt; = n&lt; v.size()。

重要的是要注意它所说的关于vector&lt; bool&gt; ,矢量&lt; bool&gt;是专门的载体&lt;&gt;碰巧试图“优化空间分配”,在某些实现中,它通过将每个布尔值存储在一个几乎使得指针算法无用的位来实现。