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 将所有内容转储到数据库中,其第三个参数是以字节为单位的 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 *指向未格式化内存的指针以及要从该指针读取的字节数。

接受 a 的接口void *将不知道任何数据结构,例如由 STL 实现的。void *需要来自没有指针的平面结构和非常稳定的二进制格式。C++ 术语是“标准布局”,最简单的事情是根本不使用任何 C++ 特性。

在这种情况下,您可以编写类似

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

但实际上最好的办法是将 GUID 放在此 blob 之外的另一个数据库列中。数据库可能会优化 GUID 的存储,您可能还希望按 GUID 查找记录。

于 2012-05-26T15:14:28.813 回答