Diferenças entre sizeof Operator e função strlen para Strings em C++

Jinku Hu 12 outubro 2023
  1. as características do operador sizeof e cenários de uso
  2. Use a função de membro std::string::size para recuperar o número de caracteres em strings
Diferenças entre sizeof Operator e função strlen para Strings em C++

Este artigo demonstrará várias diferenças ao usar o operador sizeof em oposição à função strlen com strings em C++.

as características do operador sizeof e cenários de uso

O operador sizeof é um operador unário que recupera o tamanho do armazenamento para a expressão ou tipo de dados fornecido. Este operador avalia o tamanho do objeto em unidades de bytes, e sizeof(char) é garantidamente 1.

Existe uma noção equivocada de que 1 byte sempre é igual a 8 bits e, conseqüentemente, podemos calcular o tamanho do objeto em bits. Na verdade, não é garantido que um byte tenha 8 bits pelo próprio idioma. Depende principalmente de uma plataforma de hardware subjacente. Ainda assim, a maioria dos hardwares de uso geral contemporâneos utiliza bytes de 8 bits.

Lembre-se de que o operador sizeof não pode ser aplicado à expressão que inclui uma função ou um tipo incompleto ou campos de bits. No código de exemplo a seguir, aplicamos o operador sizeof a duas matrizes de tipos diferentes e os resultados provavelmente serão os mesmos em sua plataforma também. Como o char tem garantia de tamanho de 1 byte, a matriz de 20 caracteres ocupará 20 bytes.

Por outro lado, o tipo de dados long long é definido pela implementação e, neste caso, passa a ter 8 bytes. Daí o tamanho total do array de 160 bytes. Observe que também podemos encontrar o número de elementos no array dividindo o array sizeof inteiro pelo sizeof de um elemento, como mostrado nas últimas linhas do próximo exemplo.

#include <iostream>

using std::cout;
using std::endl;

int main() {
  char arr[20];
  long long arr2[20];

  cout << "sizeof ( array of 20 long longs ) : " << sizeof arr << endl;
  cout << "sizeof ( array of 20 long longs ) : " << sizeof arr2 << endl;
  cout << "length of array of 20 chars)      : "
       << ((sizeof arr) / (sizeof arr[0])) << endl;
  cout << "length of array of 20 long longs ): "
       << ((sizeof arr2) / (sizeof arr2[0])) << endl;

  return EXIT_SUCCESS;
}

Produção:

sizeof ( array of 20 long longs ) : 20
sizeof ( array of 20 long longs ) : 160
length of array of 20 chars)      : 20
length of array of 20 long longs ): 20

Usar o operador sizeof para encontrar o comprimento da string está errado. Vamos considerar dois tipos de representação de strings em C++, uma string de caracteres e uma classe std::string. O primeiro é acessado principalmente usando o ponteiro char, e aplicando o sizeof nele irá recuperar o tamanho de armazenamento do próprio ponteiro ao invés de toda a string.

Se tentarmos recuperar o tamanho do objeto std::string usando o operador sizeof, obtemos o tamanho do armazenamento do objeto, que não será o número de caracteres na string como demonstrado no trecho de código abaixo.

#include <cstring>
#include <iostream>
#include <string>

using std::cout;
using std::endl;
using std::string;

int main() {
  const char *text1 = "arbitrary string value 1";
  string text2 = "arbitrary string value 2";

  cout << "sizeof char* : " << sizeof text1 << endl;
  cout << "sizeof string: " << sizeof text2 << endl;
  cout << "sizeof string.data: " << sizeof text2.data() << endl;

  return EXIT_SUCCESS;
}

Produção:

sizeof char* : 8
sizeof string: 32
sizeof string.data: 8

Então temos a função strlen, que é o resto da biblioteca de strings C. Ele calcula o comprimento da string de caracteres fornecida e a função retorna o número de bytes como valor integral. strlen pode ser aplicado ao ponteiro char onde uma string válida é armazenada ou ao valor retornado por std::string::c_str, mas não deve ser a escolha do programador C++.

#include <cstring>
#include <iostream>
#include <string>

using std::cout;
using std::endl;
using std::string;

int main() {
  const char *text1 = "arbitrary string value 1";
  string text2 = "arbitrary string value 2";

  cout << "strlen char* : " << strlen(text1) << endl;
  cout << "strlen string: " << strlen(text2.c_str()) << endl;

  return EXIT_SUCCESS;
}

Produção:

strlen char* : 24
strlen string: 24

Use a função de membro std::string::size para recuperar o número de caracteres em strings

Pelo contrário, o programador C++ deve utilizar a função membro size da classe std::string, pois oferece um método mais seguro para lidar com strings. Observe que podemos até usar a função de membro size se tivermos uma cadeia de caracteres. Precisamos construir um novo objeto string e invocar diretamente a função size no valor retornado. O exemplo de código a seguir mostra o uso principal para ambos os cenários.

#include <cstring>
#include <iostream>
#include <string>

using std::cout;
using std::endl;
using std::string;

int main() {
  const char *text1 = "arbitrary string value 1";
  string text2 = "arbitrary string value 2";

  cout << "length char* : " << string(text1).size() << endl;
  cout << "length string: " << text2.size() << endl;

  return EXIT_SUCCESS;
}

Produção:

length char* : 24
length string: 24
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artigo relacionado - C++ String