C++sizeof strlenメモリ整列コード解釈


sizeof strlenの詳細な使い方
  • sizeof定義
  • メモリ位置合わせ
  • コード詳細

  • sizeof定義
    sizeof演算子について、「c++primer」は139ページで次のように説明しています.
  • charまたはcharのタイプの式に対してsizeof演算を実行し、結果は1となる.
  • 参照タイプに対してsizeof演算を実行して、参照されるオブジェクトが占める空間の大きさを得る.
  • ポインタに対してsizeof()演算を行い、ポインタ自体が占める空間の大きさを得る.
  • は、解参照に対してsizeof()演算を行い、ポインタが指すオブジェクトが占める空間の大きさを得、ポインタが有効である必要はない.sizeofの演算オブジェクトで無効なポインタを参照するのは、ポインタが実際に使用されていないため、安全な動作です.sizeofは、本当に参照を解く必要がなく、オブジェクトのタイプも知ることができます.
  • 配列に対してsizeof演算を実行して配列全体が占める空間の大きさを得、配列中のすべての要素に対してsizeof演算を1回ずつ実行し、得られた結果を合計することに等価である.したがって,sizeof演算は配列をポインタに変換して処理しないことに注目すべきである.同時にsizeof演算を実行すると配列全体の大きさが得られるので、配列の大きさを単一の要素の大きさで割って配列中の要素の個数を得ることができる.
  • stringオブジェクトまたはvectorオブジェクトに対するsizeof演算はstructの計算と同様に、自身のメンバー変数に基づいて計算され、固定値(コンパイラによって若干異なる場合がある)
  • である.
    メモリの位置合わせ
    メモリの整列クラス、構造体
    1番目:最初のメンバーの最初のアドレスは0です.
    第二条:各メンバーの最初のアドレスは自分のサイズの整数倍である
    2番目の補足:4バイトの整列を例にとると、自身のサイズが4バイトより大きい場合は、4バイトの整数倍を基準に整列します.
    3つ目:最後に構造全体で位置合わせします.
    3番目の補足:4バイトの整列を例にとると、構造体の最大メンバータイプ倍数を取り、4バイトを超える場合は4バイトの整数倍を基準に整列します.△このうち、「補完」という名前もあります.補完の目的は、複数の構造変数が隣接して配置されている場合でも、整列の要求を満たすことです.
    コードの詳細
    #include
    #include
    #include
    #include
    using namespace std;
    
    void func1(char a[]) {
         
        cout <<"    :" <<sizeof(a) << endl;
    }
    
    int main() {
         
        
        cout <<"int: "<< sizeof(int) << endl;//4
        cout << "double: " << sizeof(double) << endl;//8
        cout << "char: " << sizeof(char) << endl;//1
        cout << "size_t: " << sizeof(unsigned int) << endl;//4
        cout << "long int: " << sizeof(long int) << endl;//4
        cout << "long long int: " << sizeof(long long int) << endl;//8
    
        const char* str1 = "abcdef";
        cout <<"str1: " <<sizeof(str1) << " " << sizeof(*str1) << " "<< strlen(str1) << endl;//4 1 6
        char str2[] = "abcdef";
        cout << "str2: " << sizeof(str2) << " " << sizeof(*str2) << " " << strlen(str2) << endl;//7 1 6
        char str3[10] = "abcdef";
        cout << "str3: " << sizeof(str3) << " " << sizeof(*str3) << " " << strlen(str3) << endl;//10 1 6
    
        func1(str2);//4
        func1(str3);//4
    
        const char* b = "helloworld";
        char* c[10];
        double* d;
        int** e;
        void (*pf)();
    
        cout << "char *b  "    << sizeof(b) << endl;//       ,  4  
        cout << "char *b  " << sizeof(*b) << endl; //      ,  1  
        cout << "double *d " << sizeof(d) << endl;//  ,  4  
        cout << "double *d  " << sizeof(*d) << endl;//       ,  8  
        cout << "int **e " << sizeof(e) << endl;//      ,  4  
        cout << "char *c[10]  " << sizeof(c) << endl;//    ,  40  
        cout << "void (*pf)() " << sizeof(pf) << endl;//    ,  4
    
    
        struct stu1 {
         
            char c;
            int i;
        };
        cout <<"stu1: " <<sizeof(stu1) << endl;//8
    
        /*
        #pragma pack(1)
        struct stu2 {
            char c;
            int i;
        };
        cout << "stu2: " <
    
        struct stu3 {
         
            char str[10]; 
            int i;
            char c;
           
        };
        cout << "stu3: " << sizeof(stu3) << endl;//20
    
        union u
        {
         
            int a;
            float b;
            double c;
            char d;
        };
    
        cout << "union: " << sizeof(u) << endl; //8  
    
        vector<int> v;
        vector<string> vs;
        cout <<"vector: " <<sizeof(v)<<" " << sizeof(vs) << endl;
    
        string s;
        cout << "string: " << sizeof(s) << endl;
    
        map<int,int> m;
        cout << "map: " << sizeof(m) << endl;
    
        return 0;
    }