(为什么)空字符串有地址吗

(Why) does an empty string have an address?

本文关键字:地址 字符串 为什么      更新时间:2023-10-16

我猜不会,但类似这样的输出表明它可以进行

string s="";
cout<<&s;

有地址的空字符串有什么意义?你认为这根本不应该花费任何内存吗?

是的,您保存在内存中的每个变量都有一个地址。至于"点"是什么,可能有几个:

  1. 您的(文字(字符串实际上不是"空"的,它只包含一个"\0"字符。为包含它而创建的std::string对象可以分配自己的字符缓冲区来保存此数据,因此它也不一定是空的
  2. 如果您使用的语言中的字符串是可变的(就像C++中的情况一样(,那么不能保证空字符串会保持为空
  3. 在面向对象的语言中,没有相关数据的字符串实例仍然可以用于调用字符串类上的各种实例方法。这需要内存中有一个有效的对象实例
  4. 空字符串和null字符串之间存在差异。有时这种区别可能很重要

是的,我非常同意语言的实现,即"空"变量应该仍然存在于内存中并消耗内存。在面向对象的语言中,对象的实例不仅仅是它存储的数据,拥有一个当前没有存储任何实际数据的对象实例也没有错。

根据您的逻辑,int i;也不会分配任何内存空间,因为您没有为其分配任何值。但是,在那之后,这个后续操作i = 10;怎么可能工作呢?

当您声明一个变量时,实际上是在分配一定大小的内存空间(取决于变量的类型(来存储一些东西。如果你想正确使用这个空间,这取决于你,但变量的声明是触发它的内存分配的原因。

一些编码实践表明,在需要使用变量之前,不应该声明它。

"空"字符串对象仍然是一个对象-它的内部实现可能不仅仅是存储文字字符串本身所需的内存。除此之外,大多数C风格的字符串(如C++中使用的字符串(都是以null结尾的,这意味着即使是"空"字符串也仍然使用一个字节作为结束符。

C++中的每个命名对象都有一个地址。甚至有一个特定的要求,即每个类型的大小至少为1,这样T[N]T[N+1]就不同了,或者在T a, b;中,两个变量都有不同的地址。

在您的情况下,s是一个类型为std::string的命名对象,因此它有一个地址。您根据特定值构造s这一事实并不重要。重要的是s已经被构造了,所以它是一个对象,所以它有一个地址。

s是一个string对象,因此它有一个地址。它有一些内部数据结构来跟踪字符串。例如,字符串的当前长度、为字符串保留的当前存储等。

更一般地说,C++标准要求所有对象的大小都为非零。这有助于确保每个对象都有一个唯一的地址

9类

类类型的完整对象和成员子对象的大小应为非零。

在C++中,所有类都是特定的、不变的大小。(因编译器和库而异,但在编译时特定。(std::字符串通常由指针、分配长度和使用的长度组成。这大约是12个字节,无论字符串有多长,并且您已经在调用堆栈上分配了std::string s。当您显示std::字符串的地址时,cout会显示std::字符串在内存中的位置。

如果字符串不指向任何东西,它就不会从堆中分配任何空间,这就像你所想的那样。但是,所有c字符串都以NULL结尾,因此c字符串"是一个字符长,而不是零。这意味着,当您将c字符串"分配给std::字符串时,std::string会分配1个(或多个(字节,并为其分配尾部NULL字符的值(通常为零'\0'(。

如果真的没有指向空字符串的点,那么程序员根本不会编写指令。语言是忠诚和信任的!并且永远不会认为您分配的内存被"浪费"了。即使你迷失了方向,翻过了悬崖,它也会牵着你的手走到痛苦的尽头。

我想,如果你创建了一个以后没有"使用"的变量,比如你的空字符串,编译器很可能会对它进行优化,这样一开始就不会产生任何成本。我想编译器并没有那么信任。。。