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”选项后面设置相应对齐值