C/C++基本类型占用内存总结

C/C++类型占用内存总结

C语言


C代码32位注释

/*************************************************************************
    > Description: ubuntu32位GCC4.8.4下面各变量类型大小
 ************************************************************************/

#include <stdio.h>
#include <string.h>

enum color {
    BLACK = 0,
    YELLOW = 1,
    WHITE,
    BLUE
};  //4 Byte

/*
 * 字节对齐原则:
 *   1.数据类型自身的对齐值:对于char型数据,为1;对于short型,为2,对于int,float型,为4;double类型,为8,单位字节
 *   2.结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值
 *   3.指定对齐值:#pragma pack (value)时的指定对齐值value。
 *   4.数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中小的那个值
 * 注意:32位GCC默认指定对齐为4字节,64位GCC默认指定对齐为8字节
 *     VS2010不管是32位还是64位编译器,其默认指定对齐值为结构体或者类的自身对齐值(成员中自身对齐值最大的值)
 */
struct person8 {
    char gender;    //占用2字节,自身1字节
    short age;      //占用2字节
    char party;     //占用4字节,自身1字节
    int height;     //占用4字节
    char name[5];   //占用8字节,自身5字节
    double weight;    //占用8字节
    char addr;      //占用4字节,自身1字节
};  //32 Byte   有效对齐值4

struct person4 {
    char gender;    //占用2字节,自身1字节
    short age;      //占用2字节
    char party;     //占用4字节,自身1字节
    int height;     //占用4字节
};  //12 Byte   有效对齐值4

struct person2 {
    char gender;    //占用2字节,自身1字节
    short age;      //占用2字节
    char party;     //占用2字节,自身1字节
};  //6 Byte   有效对齐值2

struct person1 {
    char gender;    //占用1字节,自身1字节
};  //1 Byte   有效对齐值1

/*
 * #pragma pack(1/2/4/8)修改指定对齐字节数
 * 注意:修改并不一定能奏效,因为还要看结构中成员最大那个对齐值
 *      成员最大对齐值超过指定对齐值,指定才能起作用
 */
#pragma pack(2)
struct Pragma_2
{
    int   a;    //4
    char  b;    //2
    double c;   //8
    char  d;    //2
};  //16 Byte   有效对齐值2

#pragma pack(1)
struct Pragma_1
{
    char  a;    //1
    double b;   //8
    char  c;    //1
};  //10 Byte   有效对齐值1
#pragma pack()

typedef struct IP {
    unsigned char szIP1;    //high
    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;   //4 Byte

static double function(int a, float b)
{
    return 0;
}

int main(void)
{
    char szchar = 65;   //1字节
    unsigned char uszchar = 95; //1字节

    short sishort = -100;   //2字节
    unsigned short usishort = 100;  //2字节

    int iint = -200;    //4字节
    unsigned int uiint= 200;    //4字节

    float ffloat = -0.8;    //4字节
    double ddouble = 99.99; //8字节

    long llong = 999;   //4字节
    unsigned long ullong = 999; //4字节
    long long lllong = 9999;    //8字节

    enum color color1;  //4字节
    union IP_addr pc_ip;    //4字节

    char* pchar;    //4字节
    int* pint;  //4字节
    long long* pllint;  //4字节
    double* pdouble;    //4字节

    double (*pffun)(int,float); //4字节

    /*
     * sizeof计算大小计算整个字符串长度
     * strlen计算截止到'\0'的字符长度
     */
    char str1[] = "12345\0678";     //str1字符串加上结束符'\0'一共占用8字节,'\067'表示一个字符
    char str2[] = "12345\\0678";    //str2字符串加上结束符'\0'一共占用11字节,'\\'表示一个'\'字符

    /* ArryNames是一个数组,故sizeof(ArryNames)大小为72字节 */
    char ArryNames[9][8] = {"Tom","Jerry","Ham","Jobs","","Benson","Nick","Evan","jiexue"};
    /* names是一个指针数组,故sizeof(names)大小为36字节 */
    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)); //标准C禁止这么使用,GCC返回1,VS编译不通过
    printf("function: %d\n", sizeof(function)); //标准C禁止这么使用,GCC返回1,VS编译不通过
    printf("&main: %d\n", sizeof(&main)); //返回4
    printf("&function: %d\n", sizeof(&function));    //返回4
    printf("main(): %d\n", sizeof(main())); //返回4
    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])); //strlen(ArryNames)会给警告,得到的依然是3
    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位注释

/*************************************************************************
    > Description: GCC4.2.1下面各变量类型大小
 ************************************************************************/

#include <stdio.h>
#include <string.h>

enum color {
    BLACK = 0,
    YELLOW = 1,
    WHITE,
    BLUE
};  //4 Byte

/*
 * 字节对齐原则:
 *   1.数据类型自身的对齐值:对于char型数据,为1;对于short型,为2,对于int,float型,为4;double类型,为8,单位字节
 *   2.结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值
 *   3.指定对齐值:#pragma pack (value)时的指定对齐值value。
 *   4.数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中小的那个值
 * 注意:32位GCC默认指定对齐为4字节,64位GCC默认指定对齐为8字节
 *     VS2010不管是32位还是64位编译器,其默认指定对齐值为结构体或者类的自身对齐值(成员中自身对齐值最大的值)
 */
struct person8 {
    char gender;    //占用2字节,自身1字节
    short age;      //占用2字节
    char party;     //占用4字节,自身1字节
    int height;     //占用4字节
    char name[5];   //占用12字节,自身5字节
    double weight;    //占用8字节
    char addr;      //占用8字节,自身1字节
};  //40 Byte   有效对齐值8

struct person4 {
    char gender;    //占用2字节,自身1字节
    short age;      //占用2字节
    char party;     //占用4字节,自身1字节
    int height;     //占用4字节
};  //12 Byte   有效对齐值4

struct person2 {
    char gender;    //占用2字节,自身1字节
    short age;      //占用2字节
    char party;     //占用2字节,自身1字节
};  //6 Byte   有效对齐值2

struct person1 {
    char gender;    //占用1字节,自身1字节
};  //1 Byte   有效对齐值1

/*
 * #pragma pack(1/2/4/8)修改指定对齐字节数
 * 注意:修改并不一定能奏效,因为还要看结构中成员最大那个对齐值
 *      成员最大对齐值超过指定对齐值,指定才能起作用
 */
#pragma pack(2)
struct Pragma_2
{
    int   a;    //4
    char  b;    //2
    double c;   //8
    char  d;    //2
};  //16 Byte   有效对齐值2

#pragma pack(1)
struct Pragma_1
{
    char  a;    //1
    double b;   //8
    char  c;    //1
};  //10 Byte   有效对齐值1
#pragma pack()

typedef struct IP {
    unsigned char szIP1;    //high
    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;   //4 Byte

static double function(int a, float b)
{
    return 0;
}

int main(void)
{
    char szchar = 65;   //1字节
    unsigned char uszchar = 95; //1字节

    short sishort = -100;   //2字节
    unsigned short usishort = 100;  //2字节

    int iint = -200;    //4字节
    unsigned int uiint= 200;    //4字节

    float ffloat = -0.8;    //4字节
    double ddouble = 99.99; //8字节

    long llong = 999;   //8字节
    unsigned long ullong = 999; //8字节
    long long lllong = 9999;    //8字节

    enum color color1;  //4字节
    union IP_addr pc_ip;    //4字节

    char* pchar;    //8字节
    int* pint;  //8字节
    long long* pllint;  //8字节
    double* pdouble;    //8字节

    double (*pffun)(int,float); //8字节

    /*
     * sizeof计算大小计算整个字符串长度
     * strlen计算截止到'\0'的字符长度
     */
    char str1[] = "12345\0678";     //str1字符串加上结束符'\0'一共占用8字节,'\067'表示一个字符
    char str2[] = "12345\\0678";    //str2字符串加上结束符'\0'一共占用11字节,'\\'表示一个'\'字符

    /* ArryNames是一个数组,故sizeof(ArryNames)大小为72字节 */
    char ArryNames[9][8] = {"Tom","Jerry","Ham","Jobs","","Benson","Nick","Evan","jiexue"};
    /* names是一个指针数组,故sizeof(names)大小为72字节 */
    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)); //标准C禁止这么使用,GCC返回1,VS编译不通过
    printf("function: %d\n", sizeof(function)); //标准C禁止这么使用,GCC返回1,VS编译不通过
    printf("&main: %d\n", sizeof(&main)); //返回8
    printf("&function: %d\n", sizeof(&function));    //返回8
    printf("main(): %d\n", sizeof(main())); //返回4
    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])); //strlen(ArryNames)会给警告,得到的依然是3
    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位注释

/*************************************************************************
    > Description: C++基本类型、类在32位GCC4.8.4 编译器下占用的内存大小
 ************************************************************************/

#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>

using namespace std;

enum color {
    BLACK = 0,
    YELLOW = 1,
    WHITE,
    BLUE
};  //4 Byte

/*
 * 字节对齐原则:
 *   1.数据类型自身的对齐值:对于char型数据,为1;对于short型,为2,对于int,float型,为4;double类型,为8,单位字节
 *   2.结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值
 *   3.指定对齐值:#pragma pack (value)时的指定对齐值value。
 *   4.数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中小的那个值
 * 注意:32位GCC默认指定对齐为4字节,64位GCC默认指定对齐为8字节
 *     VS2010不管是32位还是64位编译器,其默认指定对齐值为结构体或者类的自身对齐值(成员中自身对齐值最大的值)
 */
struct person8 {
    char gender;    //占用2字节,自身1字节
    short age;      //占用2字节
    char party;     //占用4字节,自身1字节
    int height;     //占用4字节
    char name[5];   //占用8字节,自身5字节
    double weight;    //占用8字节
    char addr;      //占用4字节,自身1字节
};  //32 Byte   有效对齐值4

struct person4 {
    char gender;    //占用2字节,自身1字节
    short age;      //占用2字节
    char party;     //占用4字节,自身1字节
    int height;     //占用4字节
};  //12 Byte   有效对齐值4

struct person2 {
    char gender;    //占用2字节,自身1字节
    short age;      //占用2字节
    char party;     //占用2字节,自身1字节
};  //6 Byte   有效对齐值2

struct person1 {
    char gender;    //占用1字节,自身1字节
};  //1 Byte   有效对齐值1

/*
 * #pragma pack(1/2/4/8)修改指定对齐字节数
 * 注意:修改并不一定能奏效,因为还要看结构中成员最大那个对齐值
 *      成员最大对齐值超过指定对齐值,指定才能起作用
 */
#pragma pack(2)
struct Pragma_2
{
    int   a;    //4
    char  b;    //2
    double c;   //8
    char  d;    //2
};  //16 Byte   有效对齐值2

#pragma pack(1)
struct Pragma_1
{
    char  a;    //1
    double b;   //8
    char  c;    //1
};  //10 Byte   有效对齐值1
#pragma pack()

typedef struct IP {
    unsigned char szIP1;    //high
    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;   //4 Byte

static double function(int a, float b)
{
    return 0;
}

/*
 * 1.类的大小为类的非静态成员数据的类型大小之和,也就是说静态成员数据不作考虑;
 * 2.类的总大小也遵守类似class字节对齐的;
 * 3.成员函数都是不会被计算的; 
 * 4.如果是子类,那么父类中的成员也会被计算;
 * 5.虚函数由于要维护虚函数表,所以要占据一个指针大小,也就是4字节.
 * 总结:一个类中,虚函数、成员函数(包括静态与非静态)和静态数据成员都不占用类对象的存储空间
 */
class Person {
private:
    unsigned short age; //占用2字节
    bool gender;        //占用1字节
    char name[16];      //占用17字节
public:
    /* 联合,占用16字节 */
    union UBffer
    {
        char buffer[13];
        int number;
    }ubuf;

    typedef char*(*f)(void*);   //不占用类对象内存
    enum{hdd,ssd,blueray}disk;  //占用4字节,按int存储

    /* 成员函数,不占用类对象的内存 */
    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; 
    } 
};  //40 Byte 有效对齐值4

/*
 * 空类型的实例中不包含任何信息,本来求sizeof的结果应该是0,但是当我们声明该类型的实例时,必须在内存中占有一定得空间,否则无法使用这些实例。
 * 至于占多少内存,由编译器决定。在GCC和Visual Studio中,每个空类型的实例占用1字节的空间。
 */
class None {

};  //1 Byte

class Parent {
private:
    static char sch;    //非实例独占,不占用实例内存
    char ch;    //占用4字节
    int* pi;    //占用4字节
public:
    Parent() {} //相当于普通函数,不占用实例内存

    /* 几个虚函数只占用一个虚函数表,只占用一个指针的大小4字节 */
    virtual void fun1() {}
    virtual void fun2() {}
    virtual ~Parent();
};  //12 Byte 有效对齐值4

class Child : public Parent{
private:
    double d;   //占用8字节
    string str; //占用4字节
public:
    Child() {}

    /* 
     * 子类将父类虚函数表继承下来,只占用一个指针的大小4字节
     * 也就是说父类有虚函数的情况下子类的虚函数不占用内存
     */
    virtual void fun1() {}
    virtual void fun3() {}
    virtual ~Child() {} 
};  //24 Byte 有效对齐值4

int main(void)
{
    /* string的实现在各库中可能有所不同,但在同一个库中相同的一点是,无论string里存放了多长的字符串,它们的sizeof()都是固定的
     *(举个不太恰当的例子,就好比int a; 无论int变量a取多大的值,sizeof(a)总为4),字符串所占的空间是从堆中动态分配的,与sizeof()无关;
     * sizeof(string) == 4可能是最为典型的实现之一,不过也有sizeof()为 12,32 字节的库,同时也与编译器有关
     * 在windows 64位操作系统下, 使用vs2010 32位编译器测试,sizeof(string) == 32。
     * 在windows 64位操作系统下, 使用vs2010 64位编译器测试,sizeof(string) == 48。
     */
    bool bl;    //1字节
    string Str = "Hello! How do you do!";   //4字节

    char szchar = 65;   //1字节
    unsigned char uszchar = 95; //1字节

    short sishort = -100;   //2字节
    unsigned short usishort = 100;  //2字节

    int iint = -200;    //4字节
    unsigned int uiint= 200;    //4字节

    float ffloat = -0.8;    //4字节
    double ddouble = 99.99; //8字节

    long llong = 999;   //4字节
    unsigned long ullong = 999; //4字节
    long long lllong = 9999;    //8字节

    enum color color1;  //4字节
    union IP_addr pc_ip;    //4字节

    char* pchar;    //4字节
    int* pint;  //4字节
    long long* pllint;  //4字节
    double* pdouble;    //4字节

    double (*pffun)(int,float); //4字节

    /*
     * sizeof计算大小计算整个字符串长度
     * strlen计算截止到'\0'的字符长度
     */
    char str1[] = "12345\0678";     //str1字符串加上结束符'\0'一共占用8字节,'\067'表示一个字符
    char str2[] = "12345\\0678";    //str2字符串加上结束符'\0'一共占用11字节,'\\'表示一个'\'字符

    /* ArryNames是一个数组,故sizeof(ArryNames)大小为72字节 */
    char ArryNames[9][8] = {"Tom","Jerry","Ham","Jobs","","Benson","Nick","Evan","jiexue"};
    /* names是一个指针数组,故sizeof(names)大小为36字节 */
    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; //返回4
    cout << "&function: " << sizeof(&function) << endl;    //返回4
    cout << "main(): " << sizeof(main()) << endl; //返回4
    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; //strlen(ArryNames)会给警告,得到的依然是3
    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;

    //getchar();
    //system("PAUSE");

    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位注释


/*************************************************************************
    > Description: C++基本类型、类在GCC 64位编译器下占用的内存大小
 ************************************************************************/

#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>

using namespace std;

enum color {
    BLACK = 0,
    YELLOW = 1,
    WHITE,
    BLUE
};  //4 Byte

/*
 * 字节对齐原则:
 *   1.数据类型自身的对齐值:对于char型数据,为1;对于short型,为2,对于int,float型,为4;double类型,为8,单位字节
 *   2.结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值
 *   3.指定对齐值:#pragma pack (value)时的指定对齐值value。
 *   4.数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中小的那个值
 * 注意:32位GCC默认指定对齐为4字节,64位GCC默认指定对齐为8字节
 *     VS2010不管是32位还是64位编译器,其默认指定对齐值为结构体或者类的自身对齐值(成员中自身对齐值最大的值)
 */
struct person8 {
    char gender;    //占用2字节,自身1字节
    short age;      //占用2字节
    char party;     //占用4字节,自身1字节
    int height;     //占用4字节
    char name[5];   //占用12字节,自身5字节
    double weight;    //占用8字节
    char addr;      //占用8字节,自身1字节
};  //40 Byte   有效对齐值8

struct person4 {
    char gender;    //占用2字节,自身1字节
    short age;      //占用2字节
    char party;     //占用4字节,自身1字节
    int height;     //占用4字节
};  //12 Byte   有效对齐值4

struct person2 {
    char gender;    //占用2字节,自身1字节
    short age;      //占用2字节
    char party;     //占用2字节,自身1字节
};  //6 Byte   有效对齐值2

struct person1 {
    char gender;    //占用1字节,自身1字节
};  //1 Byte   有效对齐值1

/*
 * #pragma pack(1/2/4/8)修改指定对齐字节数
 * 注意:修改并不一定能奏效,因为还要看结构中成员最大那个对齐值
 *      成员最大对齐值超过指定对齐值,指定才能起作用
 */
#pragma pack(2)
struct Pragma_2
{
    int   a;    //4
    char  b;    //2
    double c;   //8
    char  d;    //2
};  //16 Byte   有效对齐值2

#pragma pack(1)
struct Pragma_1
{
    char  a;    //1
    double b;   //8
    char  c;    //1
};  //10 Byte   有效对齐值1
#pragma pack()

typedef struct IP {
    unsigned char szIP1;    //high
    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;   //4 Byte

static double function(int a, float b)
{
    return 0;
}

/*
 * 1.类的大小为类的非静态成员数据的类型大小之和,也就是说静态成员数据不作考虑;
 * 2.类的总大小也遵守类似class字节对齐的;
 * 3.成员函数都是不会被计算的; 
 * 4.如果是子类,那么父类中的成员也会被计算;
 * 5.虚函数由于要维护虚函数表,所以要占据一个指针大小,也就是4字节.
 * 总结:一个类中,虚函数、成员函数(包括静态与非静态)和静态数据成员都不占用类对象的存储空间
 */
class Person {
private:
    unsigned short age; //占用2字节
    bool gender;        //占用1字节
    char name[16];      //占用17字节
public:
    /* 联合,占用16字节 */
    union UBffer
    {
        char buffer[13];
        int number;
    }ubuf;

    typedef char*(*f)(void*);   //不占用类对象内存
    enum{hdd,ssd,blueray}disk;  //占用4字节,按int存储

    /* 成员函数,不占用类对象的内存 */
    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; 
    } 
};  //40 Byte 有效对齐值4

/*
 * 空类型的实例中不包含任何信息,本来求sizeof的结果应该是0,但是当我们声明该类型的实例时,必须在内存中占有一定得空间,否则无法使用这些实例。
 * 至于占多少内存,由编译器决定。在GCC和Visual Studio中,每个空类型的实例占用1字节的空间。
 */
class None {

};  //1 Byte

class Parent {
private:
    static char sch;    //非实例独占,不占用实例内存
    char ch;    //占用8字节,自身1字节
    int* pi;    //占用8字节
public:
    Parent() {} //相当于普通函数,不占用实例内存

    /* 几个虚函数只占用一个虚函数表,只占用一个指针的大小8字节 */
    virtual void fun1() {}
    virtual void fun2() {}
    virtual ~Parent();
};  //24 Byte 有效对齐值8

class Child : public Parent{
private:
    double d;   //占用8字节
    string str; //占用32字节
public:
    Child() {}

    /* 
     * 子类将父类虚函数表继承下来,只占用一个指针的大小8字节
     * 也就是说父类有虚函数的情况下子类的虚函数不占用内存
     */
    virtual void fun1() {}
    virtual void fun3() {}
    virtual ~Child() {} 
};  //64 Byte 有效对齐值8

int main(void)
{
    /* string的实现在各库中可能有所不同,但在同一个库中相同的一点是,无论string里存放了多长的字符串,它们的sizeof()都是固定的
     * (举个不太恰当的例子,就好比int a; 无论int变量a取多大的值,sizeof(a)总为4),字符串所占的空间是从堆中动态分配的,与sizeof()无关;
     * sizeof(string) == 4可能是最为典型的实现之一,不过也有sizeof()为 12,32 字节的库,同时也与编译器有关
     * 在windows 64位操作系统下, 使用vs2010 32位编译器测试,sizeof(string) == 32。
     * 在windows 64位操作系统下, 使用vs2010 64位编译器测试,sizeof(string) == 48。
     */
    bool bl;    //1字节
    string Str = "Hello! How do you do!";   //32字节

    char szchar = 65;   //1字节
    unsigned char uszchar = 95; //1字节

    short sishort = -100;   //2字节
    unsigned short usishort = 100;  //2字节

    int iint = -200;    //4字节
    unsigned int uiint= 200;    //4字节

    float ffloat = -0.8;    //4字节
    double ddouble = 99.99; //8字节

    long llong = 999;   //8字节
    unsigned long ullong = 999; //8字节
    long long lllong = 9999;    //8字节

    enum color color1;  //4字节
    union IP_addr pc_ip;    //4字节

    char* pchar;    //8字节
    int* pint;  //8字节
    long long* pllint;  //8字节
    double* pdouble;    //8字节

    double (*pffun)(int,float); //8字节

    /*
     * sizeof计算大小计算整个字符串长度
     * strlen计算截止到'\0'的字符长度
     */
    char str1[] = "12345\0678";     //str1字符串加上结束符'\0'一共占用8字节,'\067'表示一个字符
    char str2[] = "12345\\0678";    //str2字符串加上结束符'\0'一共占用11字节,'\\'表示一个'\'字符

    /* ArryNames是一个数组,故sizeof(ArryNames)大小为72字节 */
    char ArryNames[9][8] = {"Tom","Jerry","Ham","Jobs","","Benson","Nick","Evan","jiexue"};
    /* names是一个指针数组,故sizeof(names)大小为72字节 */
    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; //返回8
    cout << "&function: " << sizeof(&function) << endl;    //返回8
    cout << "main(): " << sizeof(main()) << endl; //返回4
    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; //strlen(ArryNames)会给警告,得到的依然是3
    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;

    //getchar();
    //system("PAUSE");

    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”选项后面设置相应对齐值
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值