在以下代码中:
#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中发生变化?
答案 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
不需要存储尾随空字符,并且可能包含“非终止”空字符。