字符串大小总是32个字节

时间:2013-12-20 04:22:58

标签: c++ string io

代码:

#include <iostream>
#include <string>

int main(void)
{

    std::cout << "Please enter your name: ";
    std::string name;
    std::cin >> name;

    std::cout << std::endl;

    std::cout << "Your name is " << name << "." << std::endl;

    std::cout << "The size of '" << name << "' in bytes is " << sizeof(name)
    << "." << std::endl;

    std::cin.get();
    std::cin.get();

    return 0;
}

问题

每当我运行这个程序,并为变量'name'输入一个字符串时,它总是会输出变量的大小是32个字节。对于四个或五个字符的名称来说,这似乎相当大。是否与O / I流有关?或者它是否与字符串类中的某些内容有关?我是C ++的新手,所以感谢任何帮助。感谢。

程序的输出:

请输入你的名字:Jake

你的名字是杰克。 'Jake'的大小以字节为单位。

2 个答案:

答案 0 :(得分:6)

sizeof是一个编译时运算符,它返回对象表示的字节大小,即内存中布局的大小。它与std::string内容无关。

改为使用string.size()

答案 1 :(得分:3)

std::string由两部分组成:

  • 字符串的内容,动态分配,可以根据实际大小增大或缩小,
  • 固定足迹对象,其中包含您通过其访问内容的字符串的“锚点”。

当您访问sizeof(name)时,您将获得固定“锚点”部分的大小。如果您想查找长度,请致电name.length()name.size()。如果您想知道字符串足迹的近似下限,请添加sizeof(name) + name.size() + 1。实际足迹可能更大,因为动态部分可能具有比实际使用的更多的空间。在一些实现中,完全适合std::string的固定部分的非常短的字符串的覆盖区可以等于sizeof(name)