C++ 为什么字符串变量的sizeof()即使在内容更改时也始终返回相同的数字?

C++ 为什么字符串变量的sizeof()即使在内容更改时也始终返回相同的数字?,c++,sizeof,C++,Sizeof,这是一个相当简单的问题,但相当混乱 string R = "hhhh" ; cout<< sizeof( R )<<endl; 变化: 字符串R=“hhuuuuhh”; 不能认为sizeof是编译时可计算的。它的计算结果是类型的大小,而不是内容的大小。您甚至可以为任何std::string实例foo编写与sizeof(foo)完全相同的sizeof(std::string) 要计算std::string中的字符数,请使用size() 如果你有一个字符数组,比如说char

这是一个相当简单的问题,但相当混乱

string R = "hhhh" ;
cout<< sizeof( R )<<endl;
变化:

字符串R=“hhuuuuhh”;
不能认为
sizeof
是编译时可计算的。它的计算结果是类型的大小,而不是内容的大小。您甚至可以为任何
std::string
实例
foo
编写与
sizeof(foo)
完全相同的
sizeof(std::string)

要计算
std::string
中的字符数,请使用
size()


如果你有一个字符数组,比如说
charc[6]
,那么
c
的类型就是一个由6个
char
s组成的数组。因此,<代码>(C)(在编译时已知)将是6,因为C++标准定义了单个<代码> char > 1。

< P> <代码> sixof表达式< /Cord> >返回类型表达式存储所需的大小计算为(参见)。对于
std::string
,它包含一个指向数据的指针(可能还有一个小字符串的缓冲区),但不包含数据本身,因此它不(也不能)依赖于字符串长度。

字符串变量将由最常存储在堆栈上的部分组成,该部分具有固定的维度。此部件的大小是sizeof()返回的大小。在这个固定的部分中有一个指向堆上存储的部分的指针(或引用),该部分实际上包含您的字符,并且大小不同。然而,这个部分的大小只有在运行时才知道,而sizeof()是在编译时计算的


你可能想知道为什么。这样的事情既有C++的优点,也有缺点。C++与Python和Cy*等语言完全不同。虽然后一种语言可以生成各种动态变化的元数据(如变量的大小或类型),但付出的代价是它们都很慢。C++虽然有点“斯巴达”,但可以围绕这样的语言运行环。事实上,大多数“动态”语言实际上是用C/C++实现(编程)的。

std::string::length()
相当于
std::string::size()
。根据上下文的不同,出于代码可读性的原因,
length()
可能是首选。但是如果我想知道字节数而不是长度呢?你的意思是什么?我想是的,因为我想知道通过串行端口接收和发送的字节数。谢谢@托马斯·迪特曼垃圾!为什么我要对每个容器类型使用不同的函数来检查其大小?因为它是在编译时计算的。
4
4