Почему я получаю различные результаты при использовании sizeof для одного и того же массива символов? - PullRequest
0 голосов
/ 20 марта 2019

В основном классе я печатаю sizeof (person-> name), а затем делаю sizeof (name), которые совпадают как я передаю тот же массив символов конструктору Person Но почему я получаю разные результаты в обоих случаях
в первом случае sizeof возвращает 32 тогда как во втором случае sizeof return 6 Это вывод

Это код: -

#include <iostream>
#include "Person.h"

int main()
{

    char name[] = {'H','o','b','b','i','t'};
    Person *person = new Person(name , 203);

    std::cout << "p->Name size - " << sizeof(person->name) << " char array size   " << sizeof(name) << std::endl;

    delete person;

    return 0;

}
#include "Person.h"
#include <iostream>

Person::Person(){};

Person::Person(char name[],int age)
{
    this->name = name;
    this->age = age;
}

Person::~Person()
{
    std::cout << "\n Destructor called" << std::endl;
}

void Person::sayHello()
{
    std::cout << "\n Hello " << this->name << " " << this->age << std::endl ;   
}

1 Ответ

4 голосов
/ 20 марта 2019

sizeof в std::string не измеряет полный объем памяти, занимаемый строкой. Он измеряет, насколько велик объект std::string.

sizeof для std::string - это постоянное значение, которое не зависит от длины строки, хранящейся в нем.

A std::string имеет издержки по сравнению с char name[] из-за метаинформации и небольших оптимизаций строк, и эти накладные расходы (в зависимости от реализации) составляют максимум около 20 байтов.

Для диапазона от 0 до ~ 20 символов std::string всегда будет занимать ~ 20 байт памяти. Для более чем 20 символов std::string будет занимать ~ 20 + количество байтов символов.

Так что для действительно небольшого числа символов это может быть в 5 раз больше байтов. Но для обычного случая использования эти издержки можно игнорировать.

...