Diferencias entre sizeof Operator y función strlen para cadenas en C++

Jinku Hu 12 octubre 2023
  1. El operador sizeof Características y escenarios de uso
  2. Utilice la función miembro std::string::size para recuperar el número de caracteres en cadenas
Diferencias entre sizeof Operator y función strlen para cadenas en C++

Este artículo demostrará múltiples diferencias cuando se usa el operador sizeof en oposición a la función strlen con cadenas en C++.

El operador sizeof Características y escenarios de uso

El operador sizeof es un operador unario que recupera el tamaño de almacenamiento para la expresión o tipo de datos dado. Este operador evalúa el tamaño del objeto en unidades de bytes, y se garantiza que sizeof(char) es 1.

Existe la idea equivocada de que 1 byte siempre es igual a 8 bits y, en consecuencia, podemos calcular el tamaño del objeto en bits. En realidad, el lenguaje en sí no garantiza que un byte sea de 8 bits. Depende principalmente de una plataforma de hardware subyacente. Aún así, la mayoría del hardware de propósito general actual utiliza bytes de 8 bits.

Tenga en cuenta que el operador sizeof no se puede aplicar a la expresión que incluye una función o un tipo o campos de bits incompletos. En el siguiente código de ejemplo, aplicamos el operador sizeof a dos matrices de diferentes tipos, y es probable que los resultados también sean los mismos en su plataforma. Dado que se garantiza que el char tiene un tamaño de 1 byte, el array de 20 caracteres ocupará 20 bytes.

Por otro lado, el tipo de datos long long está definido por la implementación y, en este caso, resulta ser de 8 bytes. De ahí el tamaño total del array de 160 bytes. Observe que también podemos encontrar el número de elementos en el array dividiendo el sizeof toda el array por el sizeof un elemento, como se muestra en las últimas líneas del siguiente ejemplo.

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

Producción :

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 el operador sizeof para encontrar la longitud de la cadena es incorrecto. Consideremos dos tipos de representación de cadenas en C++, una cadena de caracteres y una clase std::string. Al primero se accede principalmente usando el puntero char, y al aplicar el sizeof en él se recuperará el tamaño de almacenamiento del puntero en sí en lugar de la cadena completa.

Si intentamos recuperar el tamaño del objeto std::string usando el operador sizeof, obtenemos el tamaño de almacenamiento del objeto, que no será el número de caracteres en la cadena como se muestra en el siguiente fragmento de código.

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

Producción :

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

Luego tenemos la función strlen, que es el remanente de la biblioteca de cadenas de C. Calcula la longitud de la cadena de caracteres dada y la función devuelve el número de bytes como valor integral. strlen se puede aplicar al puntero char donde se almacena una cadena válida o al valor devuelto por std::string::c_str, pero no debería ser la elección del programador de 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;
}

Producción :

strlen char* : 24
strlen string: 24

Utilice la función miembro std::string::size para recuperar el número de caracteres en cadenas

Por el contrario, el programador de C++ debería utilizar la función miembro size de la clase std::string, ya que ofrece un método más seguro para manejar cadenas. Observe que incluso podemos usar la función miembro size si tenemos una cadena de caracteres. Necesitamos construir un nuevo objeto string e invocar directamente la función size en el valor devuelto. El siguiente ejemplo de código muestra el uso principal para ambos escenarios.

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

Producción :

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

Artículo relacionado - C++ String