0

ここで struct testB のサイズ (バイト単位) を取得したい:

struct testA
{
    int x;
};
struct testB
{
    std::string guid;
    testA userData;
};

私はこのようなサイズを得ることができますが、それはばかげています:

int testA::size()
{
    return sizeof(testA);
}
int testB::size()
{
    return guid.size()*sizeof(TCHAR) + userData.size();
}

もっと簡単な解決策はありますか?

Ps: 当面の問題は次のようなものです。

オブジェクトをデータベースにストーリー化したいので、アプリケーションがクラッシュしたときにデータを取り戻すことができます。そこで、sqlite を使用して、構造体のすべてのメンバーを別々の行に保存しました。Protobuf メッセージのバイナリ文字列を保持するメンバーがいる以外は、すべてうまくいきます。SQL 文が無効になるため、データベースに挿入できません。

だから私は2つの解決策に行きます:

1 protobuf メッセージを json/XML テキストにシリアライズします。

2 sqlite3_bind_blob を使用してすべてのコンテンツを db にダンプします。その 3 番目のパラメーターは blob データのサイズ (バイト単位) です。問題は、構造体のサイズを取得する方法です (これは非常に複雑です)。

4

1 に答える 1

2
sizeof (testB) // how many bytes are allocated for testB object itself

おそらくあなたが望むものです、または

sizeof (testB) + guid.capacity() // also include heap allocation for string

目の前の問題についてなんらかの説明がなければ、特定の結論に達する方法はありません。

この情報の最も明白な用途は、プログラムのメモリ使用量を評価することです。この戦略はそれに適していません。プロファイラーまたはプラットフォームで利用可能なデバッグ ツールを使用して、実際のテスト ケースの実行中に割り当ての数と合計サイズを報告します。たとえば、Valgrind はこれを行う必要があります。

編集:サイズを に渡しますsqlite_bind_blob。これは、void *フォーマットされていないメモリへのポインターと、そのポインターから読み取るバイト数を受け取ります。

を受け入れるインターフェイスvoid *は、STL によって実装されるようなデータ構造を認識しません。ポインターのvoid *ないフラットな構造と非常に安定したバイナリ形式が必要です。C++ の用語は「標準レイアウト」であり、最も簡単なことは、C++ の機能をまったく使用しないことです。

この場合、次のように書くことができます

struct testB
{
    char guid[ 36 ]; // ASCII representation of hex of GUID
    testA userData;
};

しかし、実際には、このブロブの外にある別のデータベース列に GUID を配置するのが最善です。データベースは GUID のストレージを最適化する可能性があり、GUID でレコードを検索することもできます。

于 2012-05-26T15:14:28.813 に答える