簡體   English   中英

如何使用字符串和其他用戶定義類型作為其數字來獲取給定結構的大小(以字節為單位)?

[英]How to get the size (in Bytes) of a given struct with string and other user-defined types as its numbers?

我想在這里得到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語句無效。

所以我來兩個解決方案:

1將protobuf消息序列化為json / XML文本,這對我來說似乎很乏味

2使用sqlite3_bind_blob將所有內容轉儲到數據庫中,其第三個參數是blob數據的大小(以字節為單位),因此問題是:如何獲取結構的大小(這非常復雜)?

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放在此blob之外的另一個數據庫列中。 數據庫可能會優化GUID的存儲,您可能也希望按GUID查找記錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM