【问题标题】:Why I am getting varied results when using sizeof for same char array?为什么在对同一个字符数组使用 sizeof 时会得到不同的结果?
【发布时间】:2019-03-20 06:17:17
【问题描述】:

在主类中我打印 sizeof(person->name) 然后我做 sizeof(name) 是相同的 因为我将相同的 char 数组传递给 Person 构造函数。 但是为什么我在这两种情况下都会得到不同的结果
在第一种情况下 sizeof 返回 32 而在第二种情况下 sizeof 返回 6 This is output

这是代码:-

#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 ;   
}

【问题讨论】:

  • person->name是什么类型?
  • 你漏掉了Person::name的类型,但我猜是std::string,你可以通过比较你的数字和sizeof(std::string)sizeof(char[6])来找到提示。
  • 字符串类型
  • 请注意,由于您在 name 中遗漏了零终止符,因此从中创建 std::string 具有未定义的行为。
  • sizeof a stringstring 的字符长度之间没有关系。 sizeof 仅提供类型的字节大小。在最基本的情况下,string 是一个指向缓冲区的指针,该缓冲区包含字符和字符数的计数,无论string 拥有和引用多少个字符,大小可能为 8 到 16 个字节。请改用string::sizestring::length

标签: c++ c++14


【解决方案1】:

std::string 中的sizeof 不会测量字符串占用的全部内存量。它测量std::string 对象的大小。

std::string 上的sizeof 是一个常数值,与存储在其中的字符串的长度无关。

由于元信息和小字符串优化,与char name[] 相比,std::string 确实有开销,并且该开销(取决于实现)最多约为 20 个字节。

对于 0 - ~20 个字符的范围,std::string 将始终占用 ~20 字节的内存。对于超过 ~20 个字符,std::string 将占用 ~20 + 字符字节数。

所以是的,对于非常少量的字符,它可以是 5 倍以上的字节。但对于正常的用例,这种开销可以忽略不计。

【讨论】:

    猜你喜欢
    • 2011-08-11
    • 1970-01-01
    • 2023-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 2015-04-06
    • 1970-01-01
    相关资源
    最近更新 更多