C言語の外部APIライブラリの構造体Foo
があり、その上にC++インターフェースを書いています。
だから私はこのようなクラスを持っています:
class ClassFoo
{
public:
ClassFoo(const Foo * ptr) : ptr(ptr) { }
~ClassFoo();
bool method1();
int method2();
... (other methods)
private:
const Foo * ptr;
}
次に、外部ライブラリは、s のstruct Bar
コレクション、Foo
foo の数を取得するためのメソッド、およびFoo*
ポインターの配列を取得するためのメソッドである別のものを定義します。
int APIbarGetNumFoos(const Bar* ref);
void APIbarGetFoos(const Bar* ref, int maxSize, const Foo* foos[]);
私は次のように定義しますClassBar
:
class ClassBar
{
public:
ClassBar(const Bar * ptr) : ptr(ptr) { }
~ClassBar();
std::vector<ClassFoo> getFoos();
... (other methods)
private:
const Bar * ptr;
}
Foo*
ここで問題: メモリと速度の効率を高めるために、配列を割り当てて C API を呼び出し、すべてを結果ベクトルにコピーすることを避けたいと考えています。
C ++は、ClassFoo
インスタンスにポインターのみが含まれているFoo*
こと、およびそのサイズがポインターのサイズであることを保証しますか?(vtablesを回避するために)仮想メソッドを使用しない場合、次のように定義できますgetFoos()
:
std::vector<ClassFoo> ClassBar::getFoos()
{
int size = APIbarGetNumFoos(ptr);
std::vector<ClassFoo> result(size);
APIbarGetFoos(ptr, size, (const Foo**) &result[0]);
return result;
}
言い換えると、 の配列が の配列とClassFoo
厳密に同じメモリ内にあると確信できFoo*
ますか?
ありがとう!
エティエンヌ