C/C++类型占用内存总结
C语言
C代码32位注释
#include <stdio.h>
#include <string.h>
enum color {
BLACK = 0 ,
YELLOW = 1 ,
WHITE,
BLUE
};
struct person8 {
char gender;
short age;
char party;
int height;
char name[5 ];
double weight;
char addr;
};
struct person4 {
char gender;
short age;
char party;
int height;
};
struct person2 {
char gender;
short age;
char party;
};
struct person1 {
char gender;
};
#pragma pack(2)
struct Pragma_2
{
int a;
char b;
double c;
char d;
};
#pragma pack(1)
struct Pragma_1
{
char a;
double b;
char c;
};
#pragma pack()
typedef struct IP {
unsigned char szIP1;
unsigned char szIP2;
unsigned char szIP3;
unsigned char szIP4;
}IP_INT;
typedef union IP_addr {
IP_INT ip_int;
int ipv4;
char type;
}IP_ADDR;
static double function(int a, float b)
{
return 0 ;
}
int main(void )
{
char szchar = 65 ;
unsigned char uszchar = 95 ;
short sishort = -100 ;
unsigned short usishort = 100 ;
int iint = -200 ;
unsigned int uiint= 200 ;
float ffloat = -0.8 ;
double ddouble = 99.99 ;
long llong = 999 ;
unsigned long ullong = 999 ;
long long lllong = 9999 ;
enum color color1;
union IP_addr pc_ip;
char * pchar;
int * pint;
long long * pllint;
double * pdouble;
double (*pffun)(int ,float );
char str1[] = "12345\0678" ;
char str2[] = "12345\\0678" ;
char ArryNames[9 ][8 ] = {"Tom" ,"Jerry" ,"Ham" ,"Jobs" ,"" ,"Benson" ,"Nick" ,"Evan" ,"jiexue" };
const char * names[9 ] = {"Tom" ,"Jerry" ,"Ham" ,"Jobs" ,"" ,"Benson" ,"Nick" ,"Evan" ,"jiexue" };
printf (" ----------------------------- \n" );
printf ("****在%d位系统上,各类型占用字节数****\n" , sizeof (void *) * 8 );
printf ("**** GCC Version: %s ****\n" , __VERSION__);
printf (" ----------------------------- \n" );
printf ("-------------基本类型----------------\n" );
printf ("char: %d\n" , sizeof (szchar));
printf ("unsigned char: %d\n" , sizeof (uszchar));
printf ("short: %d\n" , sizeof (sishort));
printf ("unsigned short: %d\n" , sizeof (usishort));
printf ("int: %d\n" , sizeof (iint));
printf ("unsigned int: %d\n" , sizeof (uiint));
printf ("float: %d\n" , sizeof (ffloat));
printf ("double: %d\n" , sizeof (ddouble));
printf ("long: %d\n" , sizeof (llong));
printf ("unsigned long: %d\n" , sizeof (ullong));
printf ("long long: %d\n" , sizeof (lllong));
printf ("---------枚举、结构、联合------------\n" );
printf ("enum: %d\n" , sizeof (enum color));
printf ("struct person8: %d\n" , sizeof (struct person8));
printf ("struct person4: %d\n" , sizeof (struct person4));
printf ("struct person2: %d\n" , sizeof (struct person2));
printf ("struct person1: %d\n" , sizeof (struct person1));
printf ("union IPV4: %d\n" , sizeof (pc_ip));
printf ("--------指针、函数、函数指针---------\n" );
printf ("char*: %d\n" , sizeof (char *));
printf ("int*: %d\n" , sizeof (pint));
printf ("long long*: %d\n" , sizeof (pllint));
printf ("double*: %d\n" , sizeof (pdouble));
printf ("main: %d\n" , sizeof (main));
printf ("function: %d\n" , sizeof (function));
printf ("&main: %d\n" , sizeof (&main));
printf ("&function: %d\n" , sizeof (&function));
printf ("main(): %d\n" , sizeof (main()));
printf ("function*: %d\n" , sizeof (pffun));
printf ("---------------字符串----------------\n" );
printf ("str1[] = \"12345\\0678\": %d\n" ,strlen (str1));
printf ("str1[] = \"12345\\0678\": %d\n" , sizeof (str1));
printf ("str2[] = \"12345\\\\0678\": %d\n" ,strlen (str2));
printf ("str2[] = \"12345\\\\0678\": %d\n" , sizeof (str2));
printf ("char ArryNames[9][8]: %d\n" , sizeof (ArryNames));
printf ("char ArryNames[9][8]: %d\n" , strlen (ArryNames[0 ]));
printf ("char* names[9]: %d\n" , sizeof (names));
printf ("------------修改对齐方式-------------\n" );
printf ("struct Pragma_2: %d\n" , sizeof (struct Pragma_2));
printf ("struct Pragma_1: %d\n" , sizeof (struct Pragma_1));
getchar();
return 0 ;
}
输出
-----------------------------
****在32 位系统上,各类型占用字节数****
**** GCC Version: 4.8 .4 ****
-----------------------------
-------------基本类型----------------
char : 1
unsigned char : 1
short : 2
unsigned short : 2
int : 4
unsigned int : 4
float : 4
double : 8
long : 4
unsigned long : 4
long long : 8
---------枚举、结构、联合------------
enum : 4
struct person8: 32
struct person4: 12
struct person2: 6
struct person1: 1
union IPV4: 4
--------指针、函数、函数指针---------
char *: 4
int *: 4
long long *: 4
double *: 4
main: 1
function: 1
&main: 4
&function: 4
main(): 4
function*: 4
---------------字符串----------------
str1[] = "12345\0678" : 7
str1[] = "12345\0678" : 8
str2[] = "12345\\0678" : 10
str2[] = "12345\\0678" : 11
char ArryNames[9 ][8 ]: 72
char ArryNames[9 ][8 ]: 3
char * names[9 ]: 36
------------修改对齐方式-------------
struct Pragma_2: 16
struct Pragma_1: 10
-----------------------------
****在32 位系统上,各类型占用字节数****
**** Visual Studio 2010 win32 ****
-----------------------------
-------------基本类型----------------
char : 1
unsigned char : 1
short : 2
unsigned short : 2
int : 4
unsigned int : 4
float : 4
double : 8
long : 4
unsigned long : 4
long long : 8
---------枚举、结构、联合------------
enum : 4
struct person8: 40
struct person4: 12
struct person2: 6
struct person1: 1
union IPV4: 4
--------指针、函数、函数指针---------
char *: 4
int *: 4
long long *: 4
double *: 4
&main: 4
&function: 4
main(): 4
function*: 4
---------------字符串----------------
str1[] = "12345\0678" : 7
str1[] = "12345\0678" : 8
str2[] = "12345\\0678" : 10
str2[] = "12345\\0678" : 11
char ArryNames[9 ][8 ]: 72
char ArryNames[9 ][8 ]: 3
char * names[9 ]: 36
------------修改对齐方式-------------
struct Pragma_2: 16
struct Pragma_1: 10
请按任意键继续. . .
C代码64位注释
#include <stdio.h>
#include <string.h>
enum color {
BLACK = 0 ,
YELLOW = 1 ,
WHITE,
BLUE
};
struct person8 {
char gender;
short age;
char party;
int height;
char name[5 ];
double weight;
char addr;
};
struct person4 {
char gender;
short age;
char party;
int height;
};
struct person2 {
char gender;
short age;
char party;
};
struct person1 {
char gender;
};
#pragma pack(2)
struct Pragma_2
{
int a;
char b;
double c;
char d;
};
#pragma pack(1)
struct Pragma_1
{
char a;
double b;
char c;
};
#pragma pack()
typedef struct IP {
unsigned char szIP1;
unsigned char szIP2;
unsigned char szIP3;
unsigned char szIP4;
}IP_INT;
typedef union IP_addr {
IP_INT ip_int;
int ipv4;
char type;
}IP_ADDR;
static double function(int a, float b)
{
return 0 ;
}
int main(void )
{
char szchar = 65 ;
unsigned char uszchar = 95 ;
short sishort = -100 ;
unsigned short usishort = 100 ;
int iint = -200 ;
unsigned int uiint= 200 ;
float ffloat = -0.8 ;
double ddouble = 99.99 ;
long llong = 999 ;
unsigned long ullong = 999 ;
long long lllong = 9999 ;
enum color color1;
union IP_addr pc_ip;
char * pchar;
int * pint;
long long * pllint;
double * pdouble;
double (*pffun)(int ,float );
char str1[] = "12345\0678" ;
char str2[] = "12345\\0678" ;
char ArryNames[9 ][8 ] = {"Tom" ,"Jerry" ,"Ham" ,"Jobs" ,"" ,"Benson" ,"Nick" ,"Evan" ,"jiexue" };
const char * names[9 ] = {"Tom" ,"Jerry" ,"Ham" ,"Jobs" ,"" ,"Benson" ,"Nick" ,"Evan" ,"jiexue" };
printf (" ----------------------------- \n" );
printf ("****在%d位系统上,各类型占用字节数****\n" , sizeof (void *) * 8 );
printf ("**** GCC Version: %s ****\n" , __VERSION__);
printf (" ----------------------------- \n" );
printf ("-------------基本类型----------------\n" );
printf ("char: %d\n" , sizeof (szchar));
printf ("unsigned char: %d\n" , sizeof (uszchar));
printf ("short: %d\n" , sizeof (sishort));
printf ("unsigned short: %d\n" , sizeof (usishort));
printf ("int: %d\n" , sizeof (iint));
printf ("unsigned int: %d\n" , sizeof (uiint));
printf ("float: %d\n" , sizeof (ffloat));
printf ("double: %d\n" , sizeof (ddouble));
printf ("long: %d\n" , sizeof (llong));
printf ("unsigned long: %d\n" , sizeof (ullong));
printf ("long long: %d\n" , sizeof (lllong));
printf ("---------枚举、结构、联合------------\n" );
printf ("enum: %d\n" , sizeof (enum color));
printf ("struct person8: %d\n" , sizeof (struct person8));
printf ("struct person4: %d\n" , sizeof (struct person4));
printf ("struct person2: %d\n" , sizeof (struct person2));
printf ("struct person1: %d\n" , sizeof (struct person1));
printf ("union IPV4: %d\n" , sizeof (pc_ip));
printf ("--------指针、函数、函数指针---------\n" );
printf ("char*: %d\n" , sizeof (char *));
printf ("int*: %d\n" , sizeof (pint));
printf ("long long*: %d\n" , sizeof (pllint));
printf ("double*: %d\n" , sizeof (pdouble));
printf ("main: %d\n" , sizeof (main));
printf ("function: %d\n" , sizeof (function));
printf ("&main: %d\n" , sizeof (&main));
printf ("&function: %d\n" , sizeof (&function));
printf ("main(): %d\n" , sizeof (main()));
printf ("function*: %d\n" , sizeof (pffun));
printf ("---------------字符串----------------\n" );
printf ("str1[] = \"12345\\0678\": %d\n" ,strlen (str1));
printf ("str1[] = \"12345\\0678\": %d\n" , sizeof (str1));
printf ("str2[] = \"12345\\\\0678\": %d\n" ,strlen (str2));
printf ("str2[] = \"12345\\\\0678\": %d\n" , sizeof (str2));
printf ("char ArryNames[9][8]: %d\n" , sizeof (ArryNames));
printf ("char ArryNames[9][8]: %d\n" , strlen (ArryNames[0 ]));
printf ("char* names[9]: %d\n" , sizeof (names));
printf ("------------修改对齐方式-------------\n" );
printf ("struct Pragma_2: %d\n" , sizeof (struct Pragma_2));
printf ("struct Pragma_1: %d\n" , sizeof (struct Pragma_1));
getchar();
return 0 ;
}
输出
-----------------------------
****在64 位系统上,各类型占用字节数****
**** GCC Version: 4.2 .1 ****
-----------------------------
-------------基本类型----------------
char : 1
unsigned char : 1
short : 2
unsigned short : 2
int : 4
unsigned int : 4
float : 4
double : 8
long : 8
unsigned long : 8
long long : 8
---------枚举、结构、联合------------
enum : 4
struct person8: 40
struct person4: 12
struct person2: 6
struct person1: 1
union IPV4: 4
--------指针、函数、函数指针---------
char *: 8
int *: 8
long long *: 8
double *: 8
main: 1
function: 1
&main: 8
&function: 8
main(): 4
function*: 8
---------------字符串----------------
str1[] = "12345\0678" : 7
str1[] = "12345\0678" : 8
str2[] = "12345\\0678" : 10
str2[] = "12345\\0678" : 11
char ArryNames[9 ][8 ]: 72
char ArryNames[9 ][8 ]: 3
char * names[9 ]: 72
------------修改对齐方式-------------
struct Pragma_2: 16
struct Pragma_1: 10
-----------------------------
****在64 位系统上,各类型占用字节数****
**** GCC Version: 6.3 .0 ****
-----------------------------
-------------基本类型----------------
char : 1
unsigned char : 1
short : 2
unsigned short : 2
int : 4
unsigned int : 4
float : 4
double : 8
long : 8
unsigned long : 8
long long : 8
---------枚举、结构、联合------------
enum : 4
struct person8: 40
struct person4: 12
struct person2: 6
struct person1: 1
union IPV4: 4
--------指针、函数、函数指针---------
char *: 8
int *: 8
long long *: 8
double *: 8
main: 1
function: 1
&main: 8
&function: 8
main(): 4
function*: 8
---------------字符串----------------
str1[] = "12345\0678" : 7
str1[] = "12345\0678" : 8
str2[] = "12345\\0678" : 10
str2[] = "12345\\0678" : 11
char ArryNames[9 ][8 ]: 72
char ArryNames[9 ][8 ]: 3
char * names[9 ]: 72
------------修改对齐方式-------------
struct Pragma_2: 16
struct Pragma_1: 10
-----------------------------
****在64 位系统上,各类型占用字节数****
**** Visual Studio 2010 X64 ****
-----------------------------
-------------基本类型----------------
char : 1
unsigned char : 1
short : 2
unsigned short : 2
int : 4
unsigned int : 4
float : 4
double : 8
long : 4
unsigned long : 4
long long : 8
---------枚举、结构、联合------------
enum : 4
struct person8: 40
struct person4: 12
struct person2: 6
struct person1: 1
union IPV4: 4
--------指针、函数、函数指针---------
char *: 8
int *: 8
long long *: 8
double *: 8
&main: 8
&function: 8
main(): 4
function*: 8
---------------字符串----------------
str1[] = "12345\0678" : 7
str1[] = "12345\0678" : 8
str2[] = "12345\\0678" : 10
str2[] = "12345\\0678" : 11
char ArryNames[9 ][8 ]: 72
char ArryNames[9 ][8 ]: 3
char * names[9 ]: 72
------------修改对齐方式-------------
struct Pragma_2: 16
struct Pragma_1: 10
请按任意键继续. . .
总结
对于GCC编译器而言,32位与64位的差别主要体现在三个方面
字节32位默认以4字节对齐,64位以8字节对齐 对于指针32位占用4字节,64位占用8字节 long型在32位上占用4字节,64位占用8字节 对于VS2010编译器而言,32位与64位的区别
32位和64位默认都以结构体的自身对齐值对齐,除非指定比自身对齐值小的对齐值 对于指针32位占用4字节,64位占用8字节 long型在32位和64位都占用4字节
C++语言
C++代码32位注释
#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
using namespace std ;
enum color {
BLACK = 0 ,
YELLOW = 1 ,
WHITE,
BLUE
};
struct person8 {
char gender;
short age;
char party;
int height;
char name[5 ];
double weight;
char addr;
};
struct person4 {
char gender;
short age;
char party;
int height;
};
struct person2 {
char gender;
short age;
char party;
};
struct person1 {
char gender;
};
#pragma pack(2)
struct Pragma_2
{
int a;
char b;
double c;
char d;
};
#pragma pack(1)
struct Pragma_1
{
char a;
double b;
char c;
};
#pragma pack()
typedef struct IP {
unsigned char szIP1;
unsigned char szIP2;
unsigned char szIP3;
unsigned char szIP4;
}IP_INT;
typedef union IP_addr {
IP_INT ip_int;
int ipv4;
char type;
}IP_ADDR;
static double function(int a, float b)
{
return 0 ;
}
class Person {
private :
unsigned short age;
bool gender;
char name[16 ];
public :
union UBffer
{
char buffer[13 ];
int number;
}ubuf;
typedef char *(*f)(void *);
enum {hdd,ssd,blueray}disk;
Person(const char * name, bool gender, unsigned short age) {
strcpy (Person::name, name);
Person::gender = gender;
Person::age = age;
}
~Person() {cout << "~Person\n" ;}
friend ostream& operator <<(ostream& out, Person& p) {
return out << "name:" << p.name << " gender:" << p.gender << " age:" << p.age;
}
};
class None {
};
class Parent {
private :
static char sch;
char ch;
int * pi;
public :
Parent() {}
virtual void fun1() {}
virtual void fun2() {}
virtual ~Parent();
};
class Child : public Parent{
private :
double d;
string str;
public :
Child() {}
virtual void fun1() {}
virtual void fun3() {}
virtual ~Child() {}
};
int main(void )
{
bool bl;
string Str = "Hello! How do you do!" ;
char szchar = 65 ;
unsigned char uszchar = 95 ;
short sishort = -100 ;
unsigned short usishort = 100 ;
int iint = -200 ;
unsigned int uiint= 200 ;
float ffloat = -0.8 ;
double ddouble = 99.99 ;
long llong = 999 ;
unsigned long ullong = 999 ;
long long lllong = 9999 ;
enum color color1;
union IP_addr pc_ip;
char * pchar;
int * pint;
long long * pllint;
double * pdouble;
double (*pffun)(int ,float );
char str1[] = "12345\0678" ;
char str2[] = "12345\\0678" ;
char ArryNames[9 ][8 ] = {"Tom" ,"Jerry" ,"Ham" ,"Jobs" ,"" ,"Benson" ,"Nick" ,"Evan" ,"jiexue" };
const char * names[9 ] = {"Tom" ,"Jerry" ,"Ham" ,"Jobs" ,"" ,"Benson" ,"Nick" ,"Evan" ,"jiexue" };
Person p("jiexue" , true , 18 );
cout << " ----------------------------- \n" ;
cout << "****在" << sizeof (void *) * 8 << "位系统上,各类型占用字节数****\n" ;
cout << "**** GCC Version: " << __VERSION__ << " ****\n" ;
cout << " ----------------------------- \n" ;
cout << "-------------基本类型----------------\n" ;
cout << "bool: " << sizeof (bl) << endl;
cout << "string: " << sizeof (Str) << endl;
cout << "char: " << sizeof (szchar) << endl;
cout << "unsigned char: " << sizeof (uszchar) << endl;
cout << "short: " << sizeof (sishort) << endl;
cout << "unsigned short: " << sizeof (usishort) << endl;
cout << "int: " << sizeof (iint) << endl;
cout << "unsigned int: " << sizeof (uiint) << endl;
cout << "float: " << sizeof (ffloat) << endl;
cout << "double: " << sizeof (ddouble) << endl;
cout << "long: " << sizeof (llong) << endl;
cout << "unsigned long: " << sizeof (ullong) << endl;
cout << "long long: " << sizeof (lllong) << endl;
cout << "---------枚举、结构、联合------------\n" ;
cout << "enum: " << sizeof (enum color) << endl;
cout << "struct person8: " << sizeof (person8) << endl;
cout << "struct person4: " << sizeof (person4) << endl;
cout << "struct person2: " << sizeof (person2) << endl;
cout << "struct person1: " << sizeof (person1) << endl;
cout << "union IPV4: " << sizeof (pc_ip) << endl;
cout << "--------指针、函数、函数指针---------\n" ;
cout << "char*: " << sizeof (char *) << endl;
cout << "int*: " << sizeof (pint) << endl;
cout << "long long*: " << sizeof (pllint) << endl;
cout << "double*: " << sizeof (pdouble) << endl;
cout << "&main: " << sizeof (&main) << endl;
cout << "&function: " << sizeof (&function) << endl;
cout << "main(): " << sizeof (main()) << endl;
cout << "function*: " << sizeof (pffun) << endl;
cout << "---------------字符串----------------\n" ;
cout << "str1[] = \"12345\\0678\": " << strlen (str1) << endl;
cout << "str1[] = \"12345\\0678\": " << sizeof (str1) << endl;
cout << "str2[] = \"12345\\\\0678\": " << strlen (str2) << endl;
cout << "str2[] = \"12345\\\\0678\": " << sizeof (str2) << endl;
cout << "char ArryNames[9][8]: " << sizeof (ArryNames) << endl;
cout << "char ArryNames[9][8]: " << strlen (ArryNames[0 ]) << endl;
cout << "char* names[9]: " << sizeof (names) << endl;
cout << "------------修改对齐方式-------------\n" ;
cout << "struct Pragma_2: " << sizeof (struct Pragma_2) << endl;
cout << "struct Pragma_1: " << sizeof (struct Pragma_1) << endl;
cout << "---------------C++类----------------\n" ;
cout << "class Person: " << sizeof (Person ("jiexue" , true , 18 )) << endl;
cout << p << endl;
cout << "class None: " << sizeof (None) << endl;
cout << "class Parent: " << sizeof (Parent) << endl;
cout << "class Child: " << sizeof (Child) << endl;
return 0 ;
}
输出
-----------------------------
****在32 位系统上,各类型占用字节数****
**** GCC Version: 4.8 .4 ****
-----------------------------
-------------基本类型----------------
bool : 1
string : 4
char : 1
unsigned char : 1
short : 2
unsigned short : 2
int : 4
unsigned int : 4
float : 4
double : 8
long : 4
unsigned long : 4
long long : 8
---------枚举、结构、联合------------
enum : 4
struct person8: 32
struct person4: 12
struct person2: 6
struct person1: 1
union IPV4: 4
--------指针、函数、函数指针---------
char *: 4
int *: 4
long long *: 4
double *: 4
&main: 4
&function: 4
main(): 4
function*: 4
---------------字符串----------------
str1[] = "12345\0678" : 7
str1[] = "12345\0678" : 8
str2[] = "12345\\0678" : 10
str2[] = "12345\\0678" : 11
char ArryNames[9 ][8 ]: 72
char ArryNames[9 ][8 ]: 3
char * names[9 ]: 36
------------修改对齐方式-------------
struct Pragma_2: 16
struct Pragma_1: 10
---------------C++类----------------
class Person: 40
name:jiexue gender:1 age:18
class None: 1
class Parent: 12
class Child: 24
~Person
-----------------------------
****在32 位系统上,各类型占用字节数****
**** Visual Studio 2010 win32 ****
-----------------------------
-------------基本类型----------------
bool : 1
string : 32
char : 1
unsigned char : 1
short : 2
unsigned short : 2
int : 4
unsigned int : 4
float : 4
double : 8
long : 4
unsigned long : 4
long long : 8
---------枚举、结构、联合------------
enum : 4
struct person8: 40
struct person4: 12
struct person2: 6
struct person1: 1
union IPV4: 4
--------指针、函数、函数指针---------
char *: 4
int *: 4
long long *: 4
double *: 4
&main: 4
&function: 4
main(): 4
function*: 4
---------------字符串----------------
str1[] = "12345\0678" : 7
str1[] = "12345\0678" : 8
str2[] = "12345\\0678" : 10
str2[] = "12345\\0678" : 11
char ArryNames[9 ][8 ]: 72
char ArryNames[9 ][8 ]: 3
char * names[9 ]: 36
------------修改对齐方式-------------
struct Pragma_2: 16
struct Pragma_1: 10
---------------C++类----------------
class Person: 40
name:jiexue gender:1 age:18
class None: 1
class Parent: 12
class Child: 56
请按任意键继续. . .
C++代码64位注释
#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
using namespace std ;
enum color {
BLACK = 0 ,
YELLOW = 1 ,
WHITE,
BLUE
};
struct person8 {
char gender;
short age;
char party;
int height;
char name[5 ];
double weight;
char addr;
};
struct person4 {
char gender;
short age;
char party;
int height;
};
struct person2 {
char gender;
short age;
char party;
};
struct person1 {
char gender;
};
#pragma pack(2)
struct Pragma_2
{
int a;
char b;
double c;
char d;
};
#pragma pack(1)
struct Pragma_1
{
char a;
double b;
char c;
};
#pragma pack()
typedef struct IP {
unsigned char szIP1;
unsigned char szIP2;
unsigned char szIP3;
unsigned char szIP4;
}IP_INT;
typedef union IP_addr {
IP_INT ip_int;
int ipv4;
char type;
}IP_ADDR;
static double function(int a, float b)
{
return 0 ;
}
class Person {
private :
unsigned short age;
bool gender;
char name[16 ];
public :
union UBffer
{
char buffer[13 ];
int number;
}ubuf;
typedef char *(*f)(void *);
enum {hdd,ssd,blueray}disk;
Person(const char * name, bool gender, unsigned short age) {
strcpy (Person::name, name);
Person::gender = gender;
Person::age = age;
}
~Person() {cout << "~Person\n" ;}
friend ostream& operator <<(ostream& out, Person& p) {
return out << "name:" << p.name << " gender:" << p.gender << " age:" << p.age;
}
};
class None {
};
class Parent {
private :
static char sch;
char ch;
int * pi;
public :
Parent() {}
virtual void fun1() {}
virtual void fun2() {}
virtual ~Parent();
};
class Child : public Parent{
private :
double d;
string str;
public :
Child() {}
virtual void fun1() {}
virtual void fun3() {}
virtual ~Child() {}
};
int main(void )
{
bool bl;
string Str = "Hello! How do you do!" ;
char szchar = 65 ;
unsigned char uszchar = 95 ;
short sishort = -100 ;
unsigned short usishort = 100 ;
int iint = -200 ;
unsigned int uiint= 200 ;
float ffloat = -0.8 ;
double ddouble = 99.99 ;
long llong = 999 ;
unsigned long ullong = 999 ;
long long lllong = 9999 ;
enum color color1;
union IP_addr pc_ip;
char * pchar;
int * pint;
long long * pllint;
double * pdouble;
double (*pffun)(int ,float );
char str1[] = "12345\0678" ;
char str2[] = "12345\\0678" ;
char ArryNames[9 ][8 ] = {"Tom" ,"Jerry" ,"Ham" ,"Jobs" ,"" ,"Benson" ,"Nick" ,"Evan" ,"jiexue" };
const char * names[9 ] = {"Tom" ,"Jerry" ,"Ham" ,"Jobs" ,"" ,"Benson" ,"Nick" ,"Evan" ,"jiexue" };
Person p("jiexue" , true , 18 );
cout << " ----------------------------- \n" ;
cout << "****在" << sizeof (void *) * 8 << "位系统上,各类型占用字节数****\n" ;
cout << "**** GCC Version: " << __VERSION__ << " ****\n" ;
cout << " ----------------------------- \n" ;
cout << "-------------基本类型----------------\n" ;
cout << "bool: " << sizeof (bl) << endl;
cout << "string: " << sizeof (Str) << endl;
cout << "char: " << sizeof (szchar) << endl;
cout << "unsigned char: " << sizeof (uszchar) << endl;
cout << "short: " << sizeof (sishort) << endl;
cout << "unsigned short: " << sizeof (usishort) << endl;
cout << "int: " << sizeof (iint) << endl;
cout << "unsigned int: " << sizeof (uiint) << endl;
cout << "float: " << sizeof (ffloat) << endl;
cout << "double: " << sizeof (ddouble) << endl;
cout << "long: " << sizeof (llong) << endl;
cout << "unsigned long: " << sizeof (ullong) << endl;
cout << "long long: " << sizeof (lllong) << endl;
cout << "---------枚举、结构、联合------------\n" ;
cout << "enum: " << sizeof (enum color) << endl;
cout << "struct person8: " << sizeof (person8) << endl;
cout << "struct person4: " << sizeof (person4) << endl;
cout << "struct person2: " << sizeof (person2) << endl;
cout << "struct person1: " << sizeof (person1) << endl;
cout << "union IPV4: " << sizeof (pc_ip) << endl;
cout << "--------指针、函数、函数指针---------\n" ;
cout << "char*: " << sizeof (char *) << endl;
cout << "int*: " << sizeof (pint) << endl;
cout << "long long*: " << sizeof (pllint) << endl;
cout << "double*: " << sizeof (pdouble) << endl;
cout << "&main: " << sizeof (&main) << endl;
cout << "&function: " << sizeof (&function) << endl;
cout << "main(): " << sizeof (main()) << endl;
cout << "function*: " << sizeof (pffun) << endl;
cout << "---------------字符串----------------\n" ;
cout << "str1[] = \"12345\\0678\": " << strlen (str1) << endl;
cout << "str1[] = \"12345\\0678\": " << sizeof (str1) << endl;
cout << "str2[] = \"12345\\\\0678\": " << strlen (str2) << endl;
cout << "str2[] = \"12345\\\\0678\": " << sizeof (str2) << endl;
cout << "char ArryNames[9][8]: " << sizeof (ArryNames) << endl;
cout << "char ArryNames[9][8]: " << strlen (ArryNames[0 ]) << endl;
cout << "char* names[9]: " << sizeof (names) << endl;
cout << "------------修改对齐方式-------------\n" ;
cout << "struct Pragma_2: " << sizeof (struct Pragma_2) << endl;
cout << "struct Pragma_1: " << sizeof (struct Pragma_1) << endl;
cout << "---------------C++类----------------\n" ;
cout << "class Person: " << sizeof (Person ("jiexue" , true , 18 )) << endl;
cout << p << endl;
cout << "class None: " << sizeof (None) << endl;
cout << "class Parent: " << sizeof (Parent) << endl;
cout << "class Child: " << sizeof (Child) << endl;
return 0 ;
}
输出
-----------------------------
****在64 位系统上,各类型占用字节数****
**** GCC Version: 4.2 .1 ****
-----------------------------
-------------基本类型----------------
bool : 1
string : 32
char : 1
unsigned char : 1
short : 2
unsigned short : 2
int : 4
unsigned int : 4
float : 4
double : 8
long : 8
unsigned long : 8
long long : 8
---------枚举、结构、联合------------
enum : 4
struct person8: 40
struct person4: 12
struct person2: 6
struct person1: 1
union IPV4: 4
--------指针、函数、函数指针---------
char *: 8
int *: 8
long long *: 8
double *: 8
&main: 8
&function: 8
main(): 4
function*: 8
---------------字符串----------------
str1[] = "12345\0678" : 7
str1[] = "12345\0678" : 8
str2[] = "12345\\0678" : 10
str2[] = "12345\\0678" : 11
char ArryNames[9 ][8 ]: 72
char ArryNames[9 ][8 ]: 3
char * names[9 ]: 72
------------修改对齐方式-------------
struct Pragma_2: 16
struct Pragma_1: 10
---------------C++类----------------
class Person: 40
name:jiexue gender:1 age:18
class None: 1
class Parent: 24
class Child: 64
~Person
-----------------------------
****在64 位系统上,各类型占用字节数****
**** GCC Version: 6.3 .0 ****
-----------------------------
-------------基本类型----------------
bool : 1
string : 32
char : 1
unsigned char : 1
short : 2
unsigned short : 2
int : 4
unsigned int : 4
float : 4
double : 8
long : 8
unsigned long : 8
long long : 8
---------枚举、结构、联合------------
enum : 4
struct person8: 40
struct person4: 12
struct person2: 6
struct person1: 1
union IPV4: 4
--------指针、函数、函数指针---------
char *: 8
int *: 8
long long *: 8
double *: 8
&main: 8
&function: 8
main(): 4
function*: 8
---------------字符串----------------
str1[] = "12345\0678" : 7
str1[] = "12345\0678" : 8
str2[] = "12345\\0678" : 10
str2[] = "12345\\0678" : 11
char ArryNames[9 ][8 ]: 72
char ArryNames[9 ][8 ]: 3
char * names[9 ]: 72
------------修改对齐方式-------------
struct Pragma_2: 16
struct Pragma_1: 10
---------------C++类----------------
class Person: 40
name:jiexue gender:1 age:18
class None: 1
class Parent: 24
class Child: 64
~Person
-----------------------------
****在64 位系统上,各类型占用字节数****
**** GCC Version: 8.1 .0 ****
-----------------------------
-------------基本类型----------------
bool : 1
string : 32
char : 1
unsigned char : 1
short : 2
unsigned short : 2
int : 4
unsigned int : 4
float : 4
double : 8
long : 8
unsigned long : 8
long long : 8
---------枚举、结构、联合------------
enum : 4
struct person8: 40
struct person4: 12
struct person2: 6
struct person1: 1
union IPV4: 4
--------指针、函数、函数指针---------
char *: 8
int *: 8
long long *: 8
double *: 8
&main: 8
&function: 8
main(): 4
function*: 8
---------------字符串----------------
str1[] = "12345\0678" : 7
str1[] = "12345\0678" : 8
str2[] = "12345\\0678" : 10
str2[] = "12345\\0678" : 11
char ArryNames[9 ][8 ]: 72
char ArryNames[9 ][8 ]: 3
char * names[9 ]: 72
------------修改对齐方式-------------
struct Pragma_2: 16
struct Pragma_1: 10
---------------C++类----------------
class Person: 40
name:jiexue gender:1 age:18
class None: 1
class Parent: 24
class Child: 64
~Person
-----------------------------
****在64 位系统上,各类型占用字节数****
**** Visual Studio 2010 X64 ****
-----------------------------
-------------基本类型----------------
bool : 1
string : 48
char : 1
unsigned char : 1
short : 2
unsigned short : 2
int : 4
unsigned int : 4
float : 4
double : 8
long : 4
unsigned long : 4
long long : 8
---------枚举、结构、联合------------
enum : 4
struct person8: 40
struct person4: 12
struct person2: 6
struct person1: 1
union IPV4: 4
--------指针、函数、函数指针---------
char *: 8
int *: 8
long long *: 8
double *: 8
&main: 8
&function: 8
main(): 4
function*: 8
---------------字符串----------------
str1[] = "12345\0678" : 7
str1[] = "12345\0678" : 8
str2[] = "12345\\0678" : 10
str2[] = "12345\\0678" : 11
char ArryNames[9 ][8 ]: 72
char ArryNames[9 ][8 ]: 3
char * names[9 ]: 72
------------修改对齐方式-------------
struct Pragma_2: 16
struct Pragma_1: 10
---------------C++类----------------
class Person: 40
name:jiexue gender:1 age:18
class None: 1
class Parent: 24
class Child: 80
请按任意键继续. . .
总结
对于GCC编译器而言,32位与64位的差别主要体现在三个方面
字节32位默认以4字节对齐,64位以8字节对齐 对于指针32位占用4字节,64位占用8字节 long型在32位上占用4字节,64位占用8字节 string实现在32位上占用4字节,在64位上占用32字节 对于VS2010编译器而言,32位与64位的区别
32位和64位默认都以结构体的自身对齐值对齐,除非指定比自身对齐值小的对齐值 对于指针32位占用4字节,64位占用8字节 long型在32位和64位都占用4字节 string在32位下为32字节,在64位占用48字节
tips
配置VS2010编译器为64位
点击“Win32”下拉框,打开“配置管理器” 点击工程名下的平台 点击”新建”,新平台选择”X64” 确定之后可以看到活动解决平台变成了”X64” 新建好了后,可以在win32和X64之间自由切换 配置VS2010默认指定对齐值
选中工程名,右击选中”属性” 选中”配置属性”,选中”C/C++” 选中”Code Generation”,在”Struct Member Alignment”选项后面设置相应对齐值