C++의 문자열에 대한 sizeof 연산자와 strlen 함수의 차이점

Jinku Hu 2023년10월12일
  1. sizeof 연산자 특성 및 사용 시나리오
  2. std::string::size 멤버 함수를 사용하여 문자열의 문자 수 검색
C++의 문자열에 대한 sizeof 연산자와 strlen 함수의 차이점

이 기사에서는 C++에서 문자열과 함께 strlen 함수와 반대로 sizeof 연산자를 사용할 때의 여러 차이점을 보여줍니다.

sizeof 연산자 특성 및 사용 시나리오

sizeof 연산자는 주어진 표현식 또는 데이터 유형에 대한 스토리지 크기를 검색하는 단항 연산자입니다. 이 연산자는 객체 크기를 바이트 단위로 평가하며 sizeof(char)1이 보장됩니다.

1바이트는 항상 8비트와 같으며 결과적으로 객체의 크기를 비트 단위로 계산할 수 있다는 잘못된 개념이 있습니다. 실제로 바이트는 언어 자체에 의해 8비트가 보장되지 않습니다. 주로 기본 하드웨어 플랫폼에 따라 다릅니다. 그러나 대부분의 최신 범용 하드웨어는 8비트 바이트를 사용합니다.

sizeof 연산자는 함수 또는 불완전한 유형 또는 비트 필드를 포함하는 표현식에 적용할 수 없습니다. 다음 예제 코드에서 sizeof 연산자를 다른 유형의 두 배열에 적용하고 결과는 플랫폼에서도 동일할 것입니다. char는 1바이트 크기가 보장되므로 20자 배열은 20바이트를 차지합니다.

반면에 long long 데이터 유형은 구현에 따라 정의되며 이 경우 8바이트가 됩니다. 따라서 총 배열 크기는 160바이트입니다. 다음 예의 마지막 줄에 표시된 것처럼 전체 배열 sizeof를 한 요소 sizeof로 나누어 배열의 요소 수를 찾을 수도 있습니다.

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

출력:

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

sizeof 연산자를 사용하여 문자열 길이를 찾는 것은 잘못되었습니다. C++에서 문자열의 두 가지 표현 유형인 문자열과 std::string 클래스를 고려해 보겠습니다. 전자는 대부분 char 포인터를 사용하여 액세스되며 sizeof를 적용하면 전체 문자열이 아닌 포인터 자체의 저장 크기를 검색합니다.

sizeof 연산자를 사용하여 std::string 객체의 크기를 검색하려고 하면 아래 코드 스니펫에 표시된 것처럼 문자열의 문자 수가 아닌 객체의 저장 크기를 얻습니다.

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

출력:

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

그런 다음 C 문자열 라이브러리의 나머지 부분인 strlen 함수를 얻었습니다. 주어진 문자열의 길이를 계산하고 함수는 바이트 수를 정수 값으로 반환합니다. strlen은 유효한 문자열이 저장된 char 포인터나 std::string::c_str이 반환하는 값에 적용될 수 있지만 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;
}

출력:

strlen char* : 24
strlen string: 24

std::string::size 멤버 함수를 사용하여 문자열의 문자 수 검색

반대로 C++ 프로그래머는 std::string 클래스의 size 멤버 함수를 활용해야 합니다. 이는 문자열을 처리하는 더 안전한 방법을 제공하기 때문입니다. 문자열이 있는 경우 size 멤버 함수를 사용할 수도 있습니다. 새로운 string 객체를 생성하고 반환된 값에 대해 size 함수를 직접 호출해야 합니다. 다음 코드 예제에서는 두 시나리오의 기본 사용법을 보여줍니다.

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

출력:

length char* : 24
length string: 24
작가: 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

관련 문장 - C++ String