Я догадался, что нет, но этот вывод чего-то вроде этого показывает, что он делает
string s="";
cout<<&s;
какой смысл иметь пустую строку с адресом? Считаете ли вы, что это не должно стоить никакой памяти?
Я догадался, что нет, но этот вывод чего-то вроде этого показывает, что он делает
string s="";
cout<<&s;
какой смысл иметь пустую строку с адресом? Считаете ли вы, что это не должно стоить никакой памяти?
Да, каждая переменная, хранящаяся в памяти, имеет адрес. Что касается "точки", может быть несколько:
std::string
, созданный для его хранения, может выделять свой собственный буфер символов для хранения этих данных, поэтому он также не является пустым.null
. Иногда различие может быть важным.И да, я очень согласен с реализацией языка, что "пустая" переменная должна все еще существовать и потреблять память. В объектно-ориентированном языке экземпляр объекта больше, чем просто данные, которые он хранит, и нет ничего плохого в том, что у него есть экземпляр объекта, который в настоящее время не хранит никаких реальных данных.
Следуя вашей логике, int i;
также не будет выделять какое-либо пространство памяти, поскольку вы не присваиваете ему никакого значения. Но как это возможно, после этого последующая операция i = 10;
работает?
Когда вы объявляете переменную, вы фактически выделяете пространство памяти определенного размера (в зависимости от типа переменной) для хранения чего-либо. Если вы хотите использовать это пространство правильно или нет, зависит от вас, но объявление переменной - это то, что вызывает выделение памяти.
Некоторые методы кодирования говорят, что вы не должны объявлять переменную до момента, когда вам нужно ее использовать.
"пустой" строковый объект все еще является объектом - его внутренняя реализация может быть больше, чем просто память, необходимая для хранения самой литеральной строки. Кроме того, большинство строк в стиле C (например, те, что используются в С++) заканчиваются на нуль, что означает, что даже "пустая" строка по-прежнему использует один байт для терминатора.
s
- это объект string
, поэтому он имеет адрес. Он имеет некоторые внутренние структуры данных, отслеживающие строку. Например, текущая длина строки, текущее хранилище зарезервировано для строки и т.д.
В более общем плане, стандарт С++ требует, чтобы все объекты имели ненулевой размер. Это помогает гарантировать, что каждый объект имеет уникальный адрес.
9 Классы
Завершенные объекты и субобъекты классов типа класса должны иметь ненулевой размер.
Каждый именованный объект в С++ имеет адрес. Существует даже конкретное требование, чтобы размер каждого типа был не менее 1, чтобы T[N]
и T[N+1]
были разными, или так, что в T a, b;
обе переменные имеют разные адреса.
В вашем случае s
является именованным объектом типа std::string
, поэтому он имеет адрес. Тот факт, что вы построили s
из определенного значения, несуществен. Важно то, что s
был сконструирован, поэтому он является объектом, поэтому он имеет адрес.
В С++ все классы являются конкретным неизменным размером. (зависит от компилятора и библиотеки, но специфически во время компиляции.) std::string обычно состоит из указателя, длины выделения и используемой длины. Это ~ 12 байтов, независимо от того, как долго длится строка, и вы выделили std::string s в стеке вызовов. Когда вы показываете адрес std::string, cout отображает местоположение std::string в памяти.
Если строка не указывает ни на что, она не будет выделять пространство из кучи, что похоже на то, что вы думаете. Но все c-строки заканчиваются в конце NULL, поэтому c-строка "имеет один символ длинный, а не ноль. Это означает, что когда вы назначаете c-строку" " в std::string, std::string выделяет 1 (или более) байты и присваивает ей значение конечного символа NULL (обычно ноль '\ 0').
Если на пустую строку действительно не было смысла, программист вообще не записывал инструкцию. Язык верен и доверчив! И никогда не возьму на себя память, которую вы выделите, чтобы быть "потраченной впустую". Даже если вы потерялись и перейдете на скалу, она будет держать вашу руку до конца.
Я думаю, было бы интересно узнать, как и любопытство, что если вы создадите переменную, которая позже не будет использоваться, например, ваша пустая строка, компилятор может очень хорошо ее оптимизировать, поэтому не требует никаких затрат для начала. Я думаю, что компиляторы не так доверяют...