使用char数组来容纳任意大小对象的数组,对齐问题
using a char array to hold an array of arbitrarily sized objects, alignment issues?
我想向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
在没有任何对齐问题的情况下,这会像预期的那样工作吗?(也就是说,就像我刚刚声明了一个正确类型的数组一样)
假设您使用的是vector
和一个在后台使用operator new
的分配器,那么C++标准保证分配给new
的char
数组将适当对齐,以便与任何数据类型一起使用。
编辑:是的,new char[]
保证与任何类型的产品对齐。
编辑2:请注意,本地(堆栈)数组char foo[]
没有这样的对齐保证。
vector
只是动态分配内存的连续块的包装器,换句话说,就是数组。因此,如果这个程序将使用分配有malloc
或new
的数组,那么它应该继续使用vector
。
(当然,除非它只是"意外"地与数组一起工作,但vector
不太可能引入额外的问题。)
23.2.4中的C++标准保证向量的每个元素<>连续存储:
向量是连续存储的,这意味着如果v是一个向量,其中T是某种类型除布尔外,则它服从恒等式&v[n]==&v[0]+n对于所有0<=n<v.尺寸().
注意它对向量<bool>,向量<bool>是一个专门的向量<>这恰好是为了"优化空间分配",在某些实现中,它通过将每个布尔值存储在一个位中来实现这一点,这几乎使指针算法变得无用。
相关文章:
- 销毁C++中动态分配的内存(数组对象)
- 数组对象的生存期是否在重用其元素存储时结束?
- 为什么顶点数组对象会导致错误?
- 具有纯虚函数和指针数组对象类型的父类的指针数组
- 这是使用构造函数初始化数组对象的最佳方法吗?
- OpenGL 顶点数组对象与 tinyobjloader
- 将数组/对象/结构列表从C#库中传递给C MFC应用程序
- C++ RapidJson 帮助反序列化数组对象
- ptrdiff_t可以表示指向同一数组对象元素的指针的所有减法吗?
- 检查成员函数是否返回临时对象或数组对象
- 为什么 std::variant 不能容纳数组对象类型,而联合可以?
- 当数组对象以函数参数传递时,为什么复制构造函数会自称
- 如何使用箭头指针打印出一类数组对象,这些对象中有多个分数
- C++17 std::shared_ptr<> 类数组对象的重载运算符 []
- 添加两个具有运算符重载的数组对象,从而导致分段错误
- opengl:两个不同的矢量可以绑定到同一个顶点数组对象吗
- 使用相同的数据填充数组对象或使用指针
- 方法用于最快的分配,并且不需要将动态大小的数组对象作为局部变量
- 如何将2d数组对象传递给c++中的函数
- ReferenceTable溢出(jni-android),数组对象释放