在以下C ++程序中:
#include <string>
using namespace std;
int main()
{
string s = "small";
s = "bigger";
}
说变量s
是固定大小还是变量s
大小不一样更正确?
答案 0 :(得分:3)
这取决于“大小”的含义。
s的静态大小(由sizeof(s)返回)将是相同的。
但是,堆上占用的大小会因两种情况而异。
您想对这些信息做些什么?
答案 1 :(得分:2)
我会说是和不。 s将是相同的字符串实例,但它的内部缓冲区(根据您的STL实现预先分配)将包含您想要影响它的常量字符串的副本。 如果常量字符串(或任何其他字符*或字符串)的大小大于s的内部预分配缓冲区,则将根据STL实现中实现的字符串缓冲区重新分配算法重新分配s缓冲区。
答案 2 :(得分:2)
这将引发一场危险的讨论,因为在您的问题中“大小”的概念没有明确定义。
类的大小在编译时是已知的,它只是它的成员大小的总和+需要为类保留的额外信息(我承认我不知道所有细节)然而,摆脱这一点很重要的是,尺寸不会在任务之间改变。
但是,s的内存占用量可以在运行时通过堆分配来改变。因此,当您将更大的字符串分配给s时,它的内存占用量将增加,因为它可能需要在堆上分配更多空间。您应该尝试指定您想要的内容。
答案 3 :(得分:1)
两者都没有。变量s指的是字符串对象。
#include <string>
using namespace std;
int main()
{
string s = "small"; //s is assigned a reference to a new string object containing "small"
s = "bigger"; //s is modified using an overloaded operator
}
编辑,更正了一些细节并澄清了一点
请参阅:http://www.cplusplus.com/reference/string/string/,特别是http://www.cplusplus.com/reference/string/string/operator=/
分配导致原始内容被删除,并且操作右侧的内容被复制到对象中。类似于执行s.assign(“更大”),但assign具有更广泛的可接受参数。
要找到原始问题,对象的内容可以有不同的大小。有关详细信息,请参阅http://www.cplusplus.com/reference/string/string/resize/。
答案 4 :(得分:1)
std::string
变量永远不会改变其大小。它只是指具有不同大小和不同数据的不同内存。
答案 5 :(得分:1)
变量是我们通过名称引用的对象。对象的“物理”大小 - 在这种情况下是sizeof(s) - 不会改变。它们的类型仍然是std :: string,并且std :: string的大小始终是常量。但是,字符串和向量(以及其他容器)之类的东西具有“逻辑大小”,告诉我们它们存储了某种类型的元素。字符串“逻辑”存储字符。我说“逻辑上”因为字符串对象并不直接包含字符。通常它只有几个指针作为“物理成员”。由于字符串对象管理动态分配的字符数组并提供适当的复制语义和方便的字符访问,因此我们可以将这些字符作为成员(“逻辑成员”)。由于增长字符串是重新分配内存和更新指针的问题,我们甚至不需要更改sizeof(s)。
答案 6 :(得分:0)
我会说这是字符串对象,它有动态增长的能力,反之亦然