我想将一个参数数组传递给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
这会按预期工作,没有任何对齐问题吗? (就像我刚刚宣布一个正确类型的数组一样开始)
答案 0 :(得分:1)
vector
只是一个动态分配内存的连续块的包装器,换句话说就是一个数组。因此,如果此程序适用于使用malloc
或new
分配的数组,则应继续使用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;碰巧试图“优化空间分配”,在某些实现中,它通过将每个布尔值存储在一个几乎使得指针算法无用的位来实现。