基本數據類型大小-dm

1、下面是64位linux系統下常見數據類型的大小:

#include<iostream>
using namespace std;
int main()
{
        cout<<"int:"<<sizeof(int)<<endl;
        cout<<"long int:"<<sizeof(long int)<<endl;
        cout<<"float:"<<sizeof(float)<<endl;
        cout<<"char:"<<sizeof(char)<<endl;
        cout<<"double:"<<sizeof(double)<<endl;
        cout<<"char*:"<<sizeof(char*)<<endl;
        cout<<"int*:"<<sizeof(int*)<<endl;
}
輸出:int:4
   long int:8    
   float:4
     char:1
     double:8
     char*:8
     int*:8            //全部類型的指針長度都爲8
Linux系統32位與64位GCC編譯器基本數據類型長度對照表
GCC 32位
sizeof(char)=1
sizeof(double)=8
sizeof(float)=4
sizeof(int)=4
sizeof(short)=2
sizeof(long)=4
sizeof(long long)=8
sizeof(long double)=12
sizeof(complex long double)=24
GCC 64位
sizeof(char)=1
sizeof(double)=8
sizeof(float)=4
sizeof(int)=4
sizeof(short)=2
sizeof(long)=8
sizeof(long long)=8
sizeof(long double)=16
sizeof(complex long double)=32

2、sizeof()用法彙總 linux

sizeof()功能:計算數據空間的字節數
1.與strlen()比較
      strlen()計算字符數組的字符數,以"\0"爲結束判斷,不計算爲'\0'的數組元素。
      而sizeof計算數據(包括數組、變量、類型、結構體等)所佔內存空間,用字節數表示。
2.指針與靜態數組的sizeof操做
      指針都可看爲變量類型的一種。全部指針變量的sizeof 操做結果均爲4。
注意:int *p; sizeof(p)=4;
                  但sizeof(*p)至關於sizeof(int);      
      對於靜態數組,sizeof可直接計算數組大小;
      例:int a[10];char b[]="hello";
              sizeof(a)等於4*10=40;
              sizeof(b)等於6;
 注意:數組作型參時,數組名稱看成指針使用!!
               void  fun(char p[])
               {sizeof(p)等於4}    
經典問題: 
      double* (*a)[3][6]; 
      cout<<sizeof(a)<<endl; // 4 a爲指針
      cout<<sizeof(*a)<<endl; // 72 *a爲一個有3*6個指針元素的數組
      cout<<sizeof(**a)<<endl; // 24 **a爲數組一維的6個指針
      cout<<sizeof(***a)<<endl; // 4 ***a爲一維的第一個指針
      cout<<sizeof(****a)<<endl; // 8 ****a爲一個double變量
問題解析:a 是一個很奇怪的定義,他表示一個指向double*[3][6]類型數組的指針。既然是指針,因此sizeof(a)就是4 
      
既然a是執行double*[3][6]類型的指針,*a就表示一個double*[3][6]的多維數組類型,所以sizeof(*a)=3*6*sizeof(double*)=72。一樣的,**a表示一個double*[6]類型的數組,因此sizeof(**a)=6*sizeof  (double*)=24***a就表示其中的一個元素,也就是double*了,因此sizeof(***a)=4。至於****a,就是一個double了,因此sizeof(****a)=sizeof(double)=8 
3.格式的寫法
   sizeof操做符,對變量或對象能夠不加括號,但如果類型,須加括號。
4
.使用sizeof時string的注意事項
   string s="hello";
   sizeof(s)等於string類的大小,sizeof(s.c_str())獲得的是與字符串長度。
5.union 與struct的空間計算
   整體上遵循兩個原則:
   (1)總體空間是 
佔用空間最大的成員(的類型)所佔字節數的整倍數
   (2)數據對齊原則----內存按結構成員的前後順序排列,當排到該成員變量時,其前面已擺放的空間大小必須是該成員類型大小的整倍數,若是不夠則補齊,以此向後類推。。。。。
   注意:數組按照單個變量一個一個的擺放,而不是當作總體。若是成員中有自定義的類、結構體,也要注意數組問題。
例:[引用其餘帖子的內容]
由於對齊問題使結構體的sizeof變得比較複雜,看下面的例子:(默認對齊方式下)

struct s1
{
char a;
double b;
int c;
char d; 
};

struct s2
{
char a;
char b;
int c;
double d;
};

cout<<sizeof(s1)<<endl; // 24
cout<<sizeof(s2)<<endl; // 16

  
一樣是兩個char類型,一個int類型,一個double類型,可是由於對齊問題,致使他們的大小不一樣。計算結構體大小能夠採用元素擺放法,我舉例子說明一下:首先,CPU判斷結構體的對界,根據上一節的結論,s1s2的對界都取最大的元素類型,也就是double類型的對界8。而後開始擺放每一個元素。
  
對於s1,首先把a放到8的對界,假定是0,此時下一個空閒的地址是1,可是下一個元素ddouble類型,要放到8的對界上,離1最接近的地址是8了,因此d被放在了8,此時下一個空閒地址變成了16,下一個元素c的對界是416能夠知足,因此c放在了16,此時下一個空閒地址變成了20,下一個元素d須要對界1,也正好落在對界上,因此d放在了20,結構體在地址21處結束。因爲s1的大小須要是8的倍數,因此21-23的空間被保留,s1的大小變成了24
  
對於s2,首先把a放到8的對界,假定是0,此時下一個空閒地址是1,下一個元素的對界也是1,因此b擺放在1,下一個空閒地址變成了2;下一個元素c的對界是4,因此取離2最近的地址4擺放c,下一個空閒地址變成了8,下一個元素d的對界是8,因此d擺放在8,全部元素擺放完畢,結構體在15處結束,佔用總空間爲16,正好是8的倍數。

  
這裏有個陷阱,對於結構體中的結構體成員,不要認爲它的對齊方式就是他的大小,看下面的例子:
struct s1
{
char a[8];
};

struct s2
{
double d;
};

struct s3
{
s1 s;
char a;
};

struct s4
{
s2 s;
char a; 
};
cout<<sizeof(s1)<<endl; // 8
cout<<sizeof(s2)<<endl; // 8
cout<<sizeof(s3)<<endl; // 9
cout<<sizeof(s4)<<endl; // 16;
  s1
s2大小雖然都是8,可是s1的對齊方式是1s28double),因此在s3s4中才有這樣的差別。
  
因此,在本身定義結構體的時候,若是空間緊張的話,最好考慮對齊因素來排列結構體裏的元素。
 
補充:不要讓double干擾你的位域 
  在結構體和類中,可使用位域來規定某個成員所能佔用的空間,因此使用位域能在必定程度上節省結構體佔用的空間。不過考慮下面的代碼: 

struct s1 

 int i: 8; 
 int j: 4; 
 double b; 
 int a:3; 
}; 

struct s2 

 int i; 
 int j; 
 double b; 
 int a; 
}; 

struct s3 

 int i; 
 int j; 
 int a; 
 double b; 
}; 

struct s4 

 int i: 8; 
 int j: 4; 
 int a:3; 
 double b; 
}; 

cout<<sizeof(s1)<<endl; // 24 
cout<<sizeof(s2)<<endl; // 24 
cout<<sizeof(s3)<<endl; // 24 
cout<<sizeof(s4)<<endl; // 16 
  能夠看到,有double存在會干涉到位域(sizeof的算法參考上一節),因此使用位域的的時候,最好把float類型和double類型放在程序的開始或者最後。
 
相關常數: 
sizeof int:4 sizeof short:2 sizeof long:4 sizeof float:4 sizeof double:8 sizeof char:1 sizeof p:4 sizeof WORD:2 sizeof DWORD:4
相關文章
相關標籤/搜索