1. ホーム
  2. c++

[解決済み] C++におけるstring型とchar[]型の違いについて

2022-05-16 23:08:04

疑問点

C言語を少し知っていて、今C++を見ているところです。 私はCの文字列を扱うためのchar配列に慣れていますが、C++のコードを見ていると、文字列型とchar配列の両方を使用する例があることがわかります。

#include <iostream>
#include <string>
using namespace std;

int main () {
  string mystr;
  cout << "What's your name? ";
  getline (cin, mystr);
  cout << "Hello " << mystr << ".\n";
  cout << "What is your favorite team? ";
  getline (cin, mystr);
  cout << "I like " << mystr << " too!\n";
  return 0;
}

#include <iostream>
using namespace std;

int main () {
  char name[256], title[256];

  cout << "Enter your name: ";
  cin.getline (name,256);

  cout << "Enter your favourite movie: ";
  cin.getline (title,256);

  cout << name << "'s favourite movie is " << title;

  return 0;
}

(どちらの例も http://www.cplusplus.com )

これは広く聞かれ、答えられた(明白な?)質問だと思いますが、C++で文字列を扱うためのこの2つの方法の違い(パフォーマンス、API統合、それぞれが優れている方法、...)を正確に教えてくれる人がいればうれしいです。

ありがとうございます。

どのように解決するのですか?

char配列は、まさに文字の配列です。

  • (あなたの例のように) スタック上に割り当てられた場合、それが含むテキストの長さに関係なく、常に例えば 256 バイトを占めます。
  • ヒープ上に割り当てられた場合 (malloc() または new char[] を使用)、その後メモリを解放する責任があり、ヒープ割り当てのオーバーヘッドが常に発生します。
  • 256 文字以上のテキストを配列にコピーすると、クラッシュしたり、醜いアサーションメッセージを生成したり、プログラムのどこかで説明のつかない (誤った) 動作を引き起こす可能性があります。
  • テキストの長さを決定するために、配列は一文字ずつスキャンされ、"second "文字を探さなければなりません。

文字列は、文字配列を含むクラスですが、自動的に管理されます。ほとんどの文字列の実装は16文字の配列を内蔵しており(短い文字列がヒープを断片化しないように)、長い文字列にはヒープを使用します。

文字列のchar配列にはこのようにアクセスできます。

std::string myString = "Hello World";
const char *myStringChars = myString.c_str();

C++の文字列は、埋め込まれた "0 "文字を含むことができ、カウントしなくても長さがわかり、短いテキストではヒープに割り当てられた文字配列より速く、バッファオーバーランから保護されます。さらに、可読性が高く、使いやすいのです。


なぜなら、そのような DLL 関数のユーザーは、文字列クラスが異なる動作をする危険を冒さないように、まったく同じコンパイラと C++ ランタイム実装を使用していることを確認する必要があるからです。

通常、文字列クラスは呼び出し側ヒープでそのヒープメモリを解放するので、ランタイムの共有 (.dll または .so) バージョンを使用している場合にのみ、メモリを再び解放することができます。

要するに、すべての内部関数とメソッドで C++ 文字列を使用します。.dll または .so を書くことがあれば、公開 (dll/so-exposed) 関数で C 文字列を使用してください。