2012-06-14 2 views
0

Допустим, у меня есть структураиспользованием Deque с библиотекой C

struct s 
{ 
    std::deque<Object> q; //won't work with C library 
} 

Если структура с станд :: дека инициализируется с использованием библиотеки C, то он не будет работать.

struct s 
{ 
    std::vector<Object> v; //would work with C library 
} 

Однако эта структура с std :: vector будет работать с библиотекой C. Я думаю, это потому, что элементы в deque не смежны, тогда как элементы в векторе смежны. Я думаю, что это может быть причиной, но не уверен.

+5

Ваш вопрос слишком расплывчатый ... Что вы подразумеваете под «работой с библиотекой C?». Кроме того, префиксом является std ::, а не stl ::. – templatetypedef

+0

plz отредактируйте ваше сообщение ... и будьте конкретны относительно того, что хотите, и что вы пытаетесь сказать. – shalki

ответ

7

Ни одна из версий S не будет работать с библиотекой C.
Это потому, что C не имеет понятия о том, как классы выложены (или даже то, что в них).

Вектор может быть использован с библиотекой C, если вы передадите адрес элемента. Поскольку все элементы находятся в непрерывной памяти, он выглядит как обычный указатель, и поэтому любая функция C, которая принимает указатель, будет работать.

struct Object { /* NORAML POD Object */ }; 

extern "C" void cFunctionCall(Object* data, size_t size); 


std::vector<Object> v; 
// initialize v 

cFunctionCall(&v[0], v.size()); // This will work because all members of v 
           // are in contiguous memory 
+0

+1. Еще одна вещь, заслуживающая внимания: векторная версия S может «работать с библиотекой C» для определенных целей, на определенной платформе, только потому, что начало вектора начинается с, например, «Object \ * begin». Однако, в отличие от непрерывного хранения содержимого, это, очевидно, не гарантируется, это просто совпадение, поэтому, когда он переходит к следующей версии своего компилятора, он может пытаться получить доступ к «size_t len» как к объекту *, и если ему повезет он мгновенно потерпит крах. – abarnert

+0

@abarnert: На самом деле непрерывное хранение элементов в векторе гарантируется стандартом. Именно для этого варианта использования. ** НО ** версия S с вектором будет ** никогда ** работать, поскольку она содержит указатели внутри, а не набор объектов. –

+0

Перечитайте мой комментарий. Я сказал, что в отличие от непрерывного хранения содержимого (что гарантировано) не гарантируется какая-либо конкретная компоновка самого векторного объекта. – abarnert

Смежные вопросы