2017-08-26 4 views
1
#include<iostream> 
using namespace std; 

class Prac{ 
     string ch; 
     public: 
    void getstring(string g) 
      { 
      ch=g; 
      return; 
      } 
     }; 
int main() 
{ 
    Prac obj1; 
    Prac obj2; 
    string str1; 
    cout<<"Enter string for object 1"<<endl; 
    getline(cin,str1); 
    obj.getstring(str1); 
    cout<<sizeof(obj1)<<endl; 
    cout<<sizeof(obj2)<<endl; 
    return 0; 
} 

オブジェクトのサイズは、その中に存在するデータメンバーの合計サイズです。 obj1の場合、変数stringに値を挿入していますが、obj2については空白のままにしています。なぜ出力(オブジェクトのサイズ)に違いはありませんか?C++でのオブジェクトのサイズ

+2

"オブジェクトのサイズは、そこに存在するデータメンバーの合計サイズです。 - いいえ、それは真実ではありません。 「出力に何の違いもないのはなぜですか?」というのは、オブジェクトのサイズがそのオブジェクトに格納されているデータに依存しないからです。 – AnT

+0

'std :: string'は、' sizeof'によってカウントされない動的に割り当てられたメモリを含みます – SurvivalMachine

答えて

0

まず、C++のオブジェクトサイズは、コンパイル時に決定されます。したがって、実行時にサイズを変更することはできません。 Sizeofは実際に型のサイズを返します。同じタイプのすべてのオブジェクトは、言語設計によって同じサイズを持ちます。

次に、メンバー間に未使用のバイトが埋め込まれている可能性があります。したがって、型のサイズは、実際にはすべてのメンバーのサイズよりも少し大きい場合があります。

実際の質問に答えるには:可変長データはオブジェクト自体には格納されません。そのためのメモリは別々に割り当てられ、オブジェクトは割り当てられたデータへのポインタを格納するだけです。

0

あなたが言ったように、オブジェクトのサイズは、メンバーのすべてのサイズの(おおよそ)サイズです。

しかし、実行時に新しいメンバーを追加することはできませんか?

いいえ。オブジェクトのサイズは、あるタイプのコンパイル時プロパティです。あなたのオブジェクトのサイズが24の場合、それを入れても何の価値もありません。

大きな値を割り当てると、intのサイズが大きくなることが予想されるようです。いいえ、サイズは同じですが、値は異なります。

ここでは、ほぼ同じことが起こります。あなたはstd::stringを保持するクラスを持っています。文字列は、文字列データの容量、サイズ、およびポインタを保持します。これらの値に任意の値を代入しても、構造体のサイズは変更されません。

サイズが変更されたことは、文字列が指している割り当て済みバッファのサイズです。しかし、これはstd::stringクラスのサイズを変更しません。

関連する問題