程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++筆試題中非常常見的sizeof問題

C++筆試題中非常常見的sizeof問題

編輯:C++入門知識

sizeof 是一個操作符(operator),其作用返回一個對象或數據類型所占的內存字節數。
實例
[cpp] 
#include "stdafx.h" 
 
#include <stdlib.h> 
#include <iostream> 
using namespace std; 
void* Fun1() 

    printf("void\n"); 
    return NULL; 

char Fun2() 

    char c='c'; 
    printf("char c='c'"); 
    return c; 

int Fun3() 

    int i=2; 
    printf("int i=2"); 
    return i; 

struct strc0 
{  
}; 
struct strc00 
{  
    int getA(); 
}; 
struct strc000 
{  
    int* getA() 
    { 
        return NULL; 
    } 
}; 
struct strc1 

    int a; 
    char b; 
}; 
struct strc2 

    char b; 
    int a; 
}; 
struct strc3 

    char b; 
    int a; 
    double c; 
}; 
struct strc4 

    double c; 
    char b; 
    int a; 
}; 
struct strc5 

    char b; 
    double c; 
    int a; 
}; 
struct strc6 

    int a; 
    double c; 
    char b; 
}; 
struct strc7 

    int a; 
    double c; 
    char b; 
    char d; 
}; 
class classA0 

}; 
class classA00 

    int GetA(); 
    char GetB(); 
}; 
class classA000 

    int GetA() 
    { 
        return 1; 
    } 
    char GetB() 
    { 
        return 'c'; 
    } 
}; 
class classA1 

    int a; 
    double b; 
}; 
class classA2 

    char b; 
    double c; 
    int a; 
}; 
class classA3 

    char b; 
    double c; 
    int a; 
    char d; 
}; 
int _tmain(int argc, _TCHAR* argv[]) 
{   
    //基本數據類型 
    printf("%d\n",sizeof(char));// 1 
    printf("%d\n",sizeof(int));// printf("%d\n",sizeof(2)); 4  
    printf("%d\n",sizeof(double));// printf("%d\n",sizeof(2.12)); 8  
    printf("%d\n",sizeof(string));// 32 
 
    //函數:看其返回值,與內部申請的變量無關,且不調用函數 
    printf("%d\n",sizeof(Fun1()));// 4  //沒有調用函數 
    printf("%d\n",sizeof(Fun2()));// 1 
    printf("%d\n",sizeof(Fun3()));// 4 
 
    //指針:占用內存字節數都為4 
    printf("%d\n",sizeof(void*));//4 
    printf("%d\n",sizeof(int*));// 4 
 
    //數組:其值是(下標*數據類型),當數組為參數時,則淪為了指針 
    int a1[4]; 
    char a2[]="abcd";//char a2[4]="abcd";//數組界限溢出 
    char a3[6]="abcd\0";//說明“\0”是一個字符(轉義字符) 
    char a4[20]="abc"; 
    printf("%d\n",sizeof(a1));// 4*4=16 
    printf("%d\n",sizeof(a2));// 5,字符末尾還存在一個NULL的結束符 
    printf("%d\n",sizeof(a3));//6 
    printf("%d\n",sizeof(a4));//20,說明給a4分配了20個字節的內存空間,不論是否填充滿 
    printf("%d\n",sizeof(a4[10]));//1,a4[4]是一個char類型的數據 
 
    //結構體,涉及到字節對齊的問題,而字節對齊的細節與編譯器實現有關。 
    //結構體的總大小為結構體最寬基本類型成員大小的整數倍 
    //結構體每個成員相對於結構體首地址的偏移量(offset)都是成員大小的整數倍 
    //自己總結的:結構體的大小=最寬基本類型成員大小+其前後丈量的個數。其成員函數不占用內存 
    printf("%d\n",sizeof(strc0));//1,空的結構體占內存為1 
    printf("%d\n",sizeof(strc00));//1,在結構體內什麼的函數不占內存 
    printf("%d\n",sizeof(strc000));//1,在結構體內定義的函數不占內存,不論其返回值是什麼。 
    printf("%d\n",sizeof(strc1));//8,說明結構體中存在字符對齊的現象 
    printf("%d\n",sizeof(strc2));//8 
    printf("%d\n",sizeof(strc3));//不是24,而是16 
    printf("%d\n",sizeof(strc4));//不是24,而是16 
    printf("%d\n",sizeof(strc5));//不是16,而是24 
    printf("%d\n",sizeof(strc6));//不是16,而是24 
    printf("%d\n",sizeof(strc7));//24 
  
    //類:與結構體一樣。類的大小=最寬基本類型成員大小+其前後丈量的個數。且成員函數不占用內存 
    printf("%d\n",sizeof(classA0));//1 
    printf("%d\n",sizeof(classA00));//1,說明申明的函數不占內存 
    printf("%d\n",sizeof(classA000));//1,說明定義的函數不占內存 
    printf("%d\n",sizeof(classA1));//16,說明類中也存在字符對齊的現象 
    printf("%d\n",sizeof(classA2));//24 
    printf("%d\n",sizeof(classA3));//24 
 
    system("pause"); 
    return 0; 

最後總結:
類/結構體的大小=最寬成員類型+其前後丈量的個數。且成員函數不占用內存,不論其是否有返回值。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved