如何更改 sizeof(std::string)

how to change sizeof(std::string)

我将 table 数据保存在具有特定模式的文件中。我将使用 x86 来完成它并以相同的模式读取它。没错。

但是如果将编译器更改为 x64,我将无法从文件中读取数据,因为 std::string 分配大小正在改变。

在 x86 构建中:

printf("string size: %d\n", sizeof(std::string)); // output is "string size: 28"

在 x64 构建中:

printf("string size: %d\n", sizeof(std::string)); // output is "string size: 40"

当编译模式为 x64 时,由于 sizeof 变量的变化,我无法从文件中读取正确的数据。

有什么方法可以改变字符串的默认大小吗?如果我在两种编译模式下都将其设置为 28。对我来说足够了。

备注

我没有使用 sizeof 作为长度我用它来验证数据结构

typedef struct _USER_TABLE
{
    uint32_t ID;        
    string name;
    uint16_t age;
}



    DWORD dwNum;
    size_t i, j, iDataTypeCount = 0;
    ReadFile(hFile, &iDataTypeCount, 4, &dwNum, NULL);

    std::vector<int> offsets;
    if (iDataTypeCount > 0)
    {
        m_DataTypes.insert(m_DataTypes.begin(), iDataTypeCount, DT_NONE);
        ReadFile(hFile, &(m_DataTypes[0]), sizeof(DATA_TYPE) * iDataTypeCount, &dwNum, NULL);

        if (FALSE == MakeOffsetTable(offsets))
        {
            __ASSERT(0, "can't make offset table");
            return FALSE;
        }
        size_t iSize = offsets[iDataTypeCount];

        if (sizeof(Type) != iSize || DT_DWORD != m_DataTypes[0])
        {
            m_DataTypes.clear();
            printf("Data Type is mismatch or size is incorrect\n");
            return FALSE;
        }
    }

我使用 sizeof(_USER_TABLE) 来验证,sizeof 结构的变化取决于编译模式。因为字符串的大小在变化

无法更改 std::string class 的大小。改变 std::string 的大小,甚至知道该大小对在文件中存储数据也没有用,因为 std::string 不可简单复制。

您需要进行适当的序列化。一种简单的方法是存储std::string管理的缓冲区的内容,并依靠空终止符来确定写入数据的长度。


P.S。 _USER_TABLE__ASSERT:这些标识符保留给语言实现。您应该为 class 和假设您自己定义的断言使用另一个名称。