C では、char[]
文字列を表すために を使用します。
std::string
C++ の場合、配列と配列の両方を使用する例がありますchar
。
#include <iostream>
#include <string>
using namespace std;
int main () {
string name;
cout << "What's your name? ";
getline(cin, name);
cout << "Hello " << name << ".\n";
return 0;
}
#include <iostream>
using namespace std;
int main () {
char name[256];
cout << "What's your name? ";
cin.getline(name, 256);
cout << "Hello " << name << ".\n";
return 0;
}
(どちらの例もhttp://www.cplusplus.com。
C++ におけるこれら 2 つの型の違いは何ですか? (パフォーマンス、API 統合、長所/短所など)
ベストアンサー1
char 配列はまさに文字の配列です。
- スタックに割り当てられた場合(あなたの例のように)、含まれるテキストの長さに関係なく、常にたとえば256バイトを占有します。
- ヒープ上に割り当てられた場合(malloc() または new char[] を使用)、後でメモリを解放する責任があり、ヒープ割り当てのオーバーヘッドが常に発生します。
- 256 文字を超えるテキストを配列にコピーすると、クラッシュしたり、見苦しいアサーション メッセージが生成されたり、プログラムの他の場所で説明できない (誤った) 動作が発生したりする可能性があります。
- テキストの長さを決定するには、配列を文字ごとにスキャンして \0 文字を探す必要があります。
文字列は、char 配列を含むクラスですが、自動的に管理します。ほとんどの文字列実装には、16 文字の組み込み配列があり (短い文字列によってヒープが断片化されないため)、長い文字列にはヒープを使用します。
文字列の char 配列には次のようにアクセスできます。
std::string myString = "Hello World";
const char *myStringChars = myString.c_str();
C++ 文字列には、埋め込まれた \0 文字を含めることができ、数えなくても長さがわかり、短いテキストの場合はヒープに割り当てられた char 配列よりも高速で、バッファ オーバーランから保護されます。さらに、より読みやすく、使いやすくなっています。
ただし、C++ 文字列は DLL 境界を越えての使用には (あまり) 適していません。これは、このような DLL 関数のユーザーは、文字列クラスの動作が異なるリスクを避けるために、まったく同じコンパイラと C++ ランタイム実装を使用していることを確認する必要があるためです。
通常、文字列クラスは呼び出しヒープ上のヒープ メモリも解放するため、ランタイムの共有 (.dll または .so) バージョンを使用している場合にのみ、メモリを再度解放できます。
簡単に言うと、すべての内部関数とメソッドで C++ 文字列を使用します。.dll または .so を作成する場合は、パブリック (dll/so 公開) 関数で C 文字列を使用します。