Как насчет строкового типа данных в байтах - PullRequest
1 голос
/ 06 ноября 2019

Вопрос

Привет! Мой вопрос о значении типа данных строки, когда оно хранится в байтах. См. Мой код ниже:

В чем проблема

int main(){
    string name, names[6];
    std::cout<<sizeof(name)<<endl; //32 bytes
    std::cout<<sizeof "n"<<endl; //2 bytes
    std::cout<<sizeof "//n"<<endl; //3 bytes
    std::cout<<sizeof(names)<<endl; //192 bytes
}

Любое объяснение?

Почему это происходит? Может кто-нибудь объяснить мне, как хранится строковый тип данных?

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

Для начала вывод этого оператора

std::cout<<sizeof "//n"<<endl; //3 bytes

равен 4.

В этом выражении

std::cout<<sizeof(name)<<endl;

выводится размер объектатипа std::string. Это не размер строки, хранящейся в объекте. Чтобы вывести размер строки, вы должны написать

std::cout<<name.size()<<endl;

, и вы получите 0, потому что объект не содержит никакой строки.

То есть, если размер объектатип std :: string равен 32, тогда размер массива, содержащего 6 таких объектов, равен 6 * 32 = 192.

. В этом выражении

std::cout<<sizeof "n"<<endl;

выводится размерстрокового литерала "n", который содержит 2 символа ({ 'n', '\0' }), включая завершающий ноль.

И в этом выражении

std::cout<<sizeof "//n"<<endl;

также выводится размерстроковый литерал "//n", содержащий 4 символа, включая завершающий ноль.

0 голосов
/ 06 ноября 2019

По существу, объект std::string - это не что иное, как указатель на фактические строковые данные 1 и некоторую информацию о строке, которую он переносит (например, ее текущую длину). Могут быть и другие специфичные для реализации данные, которые увеличивают это число.

И чтобы понять размер строковых литералов, таких как "n", вам необходимо понимать, что все строковые литералы в C ++ действительно являются массивами постоянных символов, в том числе символ конца строки. Например, "n" - это массив из двух символов: символ 'n' и терминатор строки '\0'.

Это означает, что ваше утверждение, что sizeof "//n" - это три байта, неверно, это действительно четыре байта. .

Наконец, размер массива - это общий размер массива. Другими словами, размер каждого элемента умножается на количество элементов.


1 Хотя это "классический" вид std::string, это не всегда так, посколькучасто то, что называется оптимизация короткой строки , где короткая строка может быть полностью сохранена внутри самого объекта std::string. Там нет стандартизированного предела, который определяет «короткую строку», и это действительно детали реализации.

...