如何更改 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 和假设您自己定义的断言使用另一个名称。
我将 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 和假设您自己定义的断言使用另一个名称。