sizeof in c ++显示字符串大小少一个

时间:2012-08-25 06:05:34

标签: c++ string

在C ++中,我试图获得string的大小说“gibbs”;

当我使用sizeof函数时,它返回的尺寸小于实际尺寸之一。

我的代码如下:

 string s = "gibbs";
 cout << sizeof(s) <<endl;

并输出为:4。我猜它应该是5.

如何解决此问题。我们可以添加+1总是返回sizeof,但这是完美的解决方案吗?

4 个答案:

答案 0 :(得分:9)

sizeof(s)为您提供对象s的大小,而不是对象s中存储的字符串的长度。

你需要写下这个:

cout << s.size() << endl;

请注意,std::basic_string(以及std::string扩展名}具有size()成员函数。 std::basic_string还有一个length成员函数,它返回与size()相同的值。所以你也可以这样写:

cout << s.length() << endl;

我个人更喜欢size()成员函数,因为标准库中的其他容器(如std::vectorstd::liststd::map等)具有{{ 1}}成员函数但不是size()。也就是说,length()是标准库容器类模板的统一接口。我不需要专门为size()(或任何其他容器类模板)记住它。成员函数std::string是这种意义上的偏差。

答案 1 :(得分:4)

您的示例中的

sizeof(s)返回std::string的大小,与其成员指向的内容无关。

  

如何解决此问题。我们可以添加+1总是返回sizeof,但这是完美的解决方案吗?

不会因为值不变而无法解决任何问题,而sizeof未提供您期望的值。

如果您想知道字符串字符序列所需的字符数,可以使用s.length()s.size() - 将该值加1以了解终止所需的大小字符串。

另请注意,sizeof的值在库和平台之间不一致。 std::string实施可能会有很大差异。特别是,您可能会看到指针大小的差异,您可能会看到小字符串优化。

答案 2 :(得分:1)

因为这是系统上字符串类型的大小,而不是基础数据的大小。例如:

#include <iostream>

int main (void) {
    std::string s1 = "gibbs";
    std::string s2 = "a much longer string";
    std::cout << sizeof(s1) << '\n';
    std::cout << sizeof(s2) << '\n';

    std::cout << s1.length() << '\n';
    std::cout << s2.length() << '\n';

    return 0;
}

产生

4
4
5
20

换句话说,您应该使用std::string::length()来获取字符串的长度。

答案 3 :(得分:1)

sizeof返回对象类型的大小std::string,恰好是您系统上的4。这个可能是因为您正在处理的std::string的实现使用pimpl idiom - 即它只包含指向真实实现的指针你正在寻找,指针发生在你的主机环境中是32位。但是,您更有可能使用copy-on-write implementation std::string,它不再符合C ++ 11标准中的规范。

std::string被定义为std::basic_string模板类的特化,特别是std::basic_string<char>;你应该看到std::basic_string上的文档。请查看std::basic_string::sizestd::basic_string::length

std::string s = "stackoverflow";
std::assert(s.size() == 13);
相关问题