Подтвердить что ты не робот

(Почему) имеет пустую строку адрес?

Я догадался, что нет, но этот вывод чего-то вроде этого показывает, что он делает

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

какой смысл иметь пустую строку с адресом? Считаете ли вы, что это не должно стоить никакой памяти?

4b9b3361

Ответ 1

Да, каждая переменная, хранящаяся в памяти, имеет адрес. Что касается "точки", может быть несколько:

  • Ваша (буквальная) строка на самом деле не "пуста", она содержит единственный символ "\ 0". Объект std::string, созданный для его хранения, может выделять свой собственный буфер символов для хранения этих данных, поэтому он также не является пустым.
  • Если вы используете язык, в котором строки изменяемы (как в случае с С++), тогда нет гарантии, что пустая строка останется пустой.
  • В объектно-ориентированном языке экземпляр строки без связанных с ним данных все еще может использоваться для вызова различных методов экземпляров в классе строк. Для этого требуется действительный экземпляр объекта в памяти.
  • Существует разница между пустой строкой и строкой null. Иногда различие может быть важным.

И да, я очень согласен с реализацией языка, что "пустая" переменная должна все еще существовать и потреблять память. В объектно-ориентированном языке экземпляр объекта больше, чем просто данные, которые он хранит, и нет ничего плохого в том, что у него есть экземпляр объекта, который в настоящее время не хранит никаких реальных данных.

Ответ 2

Следуя вашей логике, int i; также не будет выделять какое-либо пространство памяти, поскольку вы не присваиваете ему никакого значения. Но как это возможно, после этого последующая операция i = 10; работает?

Когда вы объявляете переменную, вы фактически выделяете пространство памяти определенного размера (в зависимости от типа переменной) для хранения чего-либо. Если вы хотите использовать это пространство правильно или нет, зависит от вас, но объявление переменной - это то, что вызывает выделение памяти.

Некоторые методы кодирования говорят, что вы не должны объявлять переменную до момента, когда вам нужно ее использовать.

Ответ 3

"пустой" строковый объект все еще является объектом - его внутренняя реализация может быть больше, чем просто память, необходимая для хранения самой литеральной строки. Кроме того, большинство строк в стиле C (например, те, что используются в С++) заканчиваются на нуль, что означает, что даже "пустая" строка по-прежнему использует один байт для терминатора.

Ответ 4

s - это объект string, поэтому он имеет адрес. Он имеет некоторые внутренние структуры данных, отслеживающие строку. Например, текущая длина строки, текущее хранилище зарезервировано для строки и т.д.

В более общем плане, стандарт С++ требует, чтобы все объекты имели ненулевой размер. Это помогает гарантировать, что каждый объект имеет уникальный адрес.

9 Классы

Завершенные объекты и субобъекты классов типа класса должны иметь ненулевой размер.

Ответ 5

Каждый именованный объект в С++ имеет адрес. Существует даже конкретное требование, чтобы размер каждого типа был не менее 1, чтобы T[N] и T[N+1] были разными, или так, что в T a, b; обе переменные имеют разные адреса.

В вашем случае s является именованным объектом типа std::string, поэтому он имеет адрес. Тот факт, что вы построили s из определенного значения, несуществен. Важно то, что s был сконструирован, поэтому он является объектом, поэтому он имеет адрес.

Ответ 6

В С++ все классы являются конкретным неизменным размером. (зависит от компилятора и библиотеки, но специфически во время компиляции.) std::string обычно состоит из указателя, длины выделения и используемой длины. Это ~ 12 байтов, независимо от того, как долго длится строка, и вы выделили std::string s в стеке вызовов. Когда вы показываете адрес std::string, cout отображает местоположение std::string в памяти.

Если строка не указывает ни на что, она не будет выделять пространство из кучи, что похоже на то, что вы думаете. Но все c-строки заканчиваются в конце NULL, поэтому c-строка "имеет один символ длинный, а не ноль. Это означает, что когда вы назначаете c-строку" " в std::string, std::string выделяет 1 (или более) байты и присваивает ей значение конечного символа NULL (обычно ноль '\ 0').

Ответ 7

Если на пустую строку действительно не было смысла, программист вообще не записывал инструкцию. Язык верен и доверчив! И никогда не возьму на себя память, которую вы выделите, чтобы быть "потраченной впустую". Даже если вы потерялись и перейдете на скалу, она будет держать вашу руку до конца.

Я думаю, было бы интересно узнать, как и любопытство, что если вы создадите переменную, которая позже не будет использоваться, например, ваша пустая строка, компилятор может очень хорошо ее оптимизировать, поэтому не требует никаких затрат для начала. Я думаю, что компиляторы не так доверяют...