演算子sizeof()
は、指定された型またはオブジェクトのサイズをバイト単位で返します。「型のバージョン」は非常に理解しやすいですが、「オブジェクトのバージョン」については、次の 1 つのことを覚えておく必要があります。
sizeof()
型定義のみを見て、そのメンバーのサイズと数から合計サイズを推測します (一般に、多相型および複数の継承型には、追加の「隠し」メンバーがある場合があります)。
つまり、次のように仮定します。
struct A
{
int* p1;
char* p2;
};
ご想像のとおり、sizeof(A)
8 が返されます (ほとんどの 32 ビット システムではポインターが 4 バイト型であるため)。しかし、次のようなことをすると:
A a_1;
a_1.p1 = new int[64];
sizeof(a_1)
これは、new によって割り当てられ、A のメンバーによってポイントされたメモリが、このオブジェクトに「属していない」ためです。
そしてそれが理由sizeof(str)
でありstr.length()
、異なる結果をもたらします。std::string
ヒープ上の文字にメモリを (動的に、 経由でmalloc()
) 割り当てるため、文字列のサイズは変更されません。
したがって、ネットワーク経由で文字列を送信したい場合は、適切なサイズはstr.len()
であり、 を呼び出すことでデータ ポインタを取得できますstr.c_str()
。
strlen(str)
「同等」の部分がわかりませんでした。C++ にはstrlen()
、まったく同じように機能する、同じプロトタイプを持つ関数もあります。が必要なだけなconst char*
ので、 for には使用できませんstd::string
(ただしstrlen(str.c_str())
、std::string
の内部文字列は null で終了することが保証されているため、使用できます)。すでに行ったように使用しますstd::string
。.length()