использование массива char для хранения массива объектов произвольного размера, проблемы с выравниванием? - PullRequest
1 голос
/ 17 июня 2011

Я хочу передать массив параметров в SQLBindParameters, и этот массив должен храниться в массиве char (так как я заранее не знаю тип) (я хочу, чтобы все элементы в массиве были одинаковыми ).

У меня будет указатель на пример типа параметра и размер параметра.

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 ]

1 голос
/ 17 июня 2011

Если вы используете vector с распределителем, который использует operator new под капотом, то стандарт C ++ гарантирует, что массив char, выделенный с new, будет выровнен соответствующим образом для использования с любыми даннымиtype.

EDIT: Да, new char[] гарантированно выровнен для использования с любым типом.

EDIT2: Обратите внимание, что локальный (стек) массив char foo[] не имеет такого выравниваниягарантии.

1 голос
/ 17 июня 2011

A vector - это просто оболочка вокруг непрерывного блока динамически выделяемой памяти, другими словами, массива.Таким образом, если эта программа будет работать с массивом, выделенным с malloc или new, она должна продолжать работать с vector.

(если только она не работала «случайно» с массивом изконечно, но vector вряд ли создаст дополнительные проблемы.)

0 голосов
/ 17 июня 2011

Стандарт C ++ в 23.2.4 гарантирует, что каждый элемент вектора <> хранится непрерывно:

Элементы вектор хранится смежно, это означает, что если v является вектором, где T некоторого типа кроме bool, он подчиняется идентификатору & v [n] == & v [0] + n для всех 0 <= n <v.size (). </p>

Важно отметить, что он говорит о векторе , вектор - это специализированный вектор <>, который пытается «оптимизировать распределение пространства», в некоторых реализациях он делает это, сохраняя каждое логическое значение в бит, который делает арифметику указателей бесполезной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...