为什么std :: string上的Sizeof运算符会产生意外结果?

时间:2017-02-16 09:41:57

标签: c++ string sizeof

在以下代码中:

#include <iostream>
#include <string>
using namespace std;

int main() {
    char buff[100];
    _snprintf(buff, sizeof(buff), "%s %d", "Name",2); //snprintf incase of ideone
    string buffAsStdStr = buff;
    cout<<buffAsStdStr<<endl;
    cout<<"len: "<<buffAsStdStr.length()<<endl;
    cout<<sizeof(buffAsStdStr)<<endl;

    return 0;
}

buffAsStdStr中字符串的长度为6,但是当我在Visual Studio 2012中运行时,sizeof show的值为28,在ideone中为32。 预期大小为7,包括尾随的NULL char。

sizeof运算符出现意外结果的原因是什么? 为什么结果会在visual studio和ideone中发生变化?

3 个答案:

答案 0 :(得分:7)

sizeof实例的

std::string只返回std::string的“内部表示”的大小(以字节为单位),即您可以将其视为sizeof的总和每个std::string数据成员的{1}}个(也可能涉及填充)。

例如,在使用VS2015的32位调试版本中,sizeof(std::string)返回28;在64位调试版本中,我得到40;在32位发布版本中,我得到24,在64位版本中构建32。

这是因为std::string 内部表示使用不同的构建选项更改:例如调试版本通常包含额外的机制来帮助发现错误,这会增加表示的大小;而且,在64位构建中,指针更大,因此相对于32位构建等,大小也会增加。

因此,从sizeof实例调用的std::string获得的数字通常与创建字符串文本的char的数量不同 。要获得此号码,您必须致电std::string::size or std::string::length

答案 1 :(得分:3)

您应该使用std::string::size, or std::string::length

sizeof返回对象的大小,它不包含所包含的字符数。

答案 2 :(得分:3)

原因是sizeof(buffAsStdStr)不是字符串的长度,而是std::string实例的大小,并且给定类型的每个实例都具有相同的大小。

sizeof的结果在编译期间确定,如果您有o类型的对象T,则sizeof(o)sizeof(T)是等效的。< / p>

此外,std::string不需要存储尾随空字符,并且可能包含“非终止”空字符。