C++笔试题中非常常见的sizeof问题

sizeof 是一个操作符(operator),其作用返回一个对象或数据类型所占的内存字节数。

实例

#include "stdafx.h"

#include <stdlib.h>
#include <iostream>
using namespace std;
void* Fun1()
{
    printf("void\n");
    return NULL;
}
char Fun2()
{
    char c='c';
    printf("char c='c'");
    return c;
}
int Fun3()
{
    int i=2;
    printf("int i=2");
    return i;
}
struct strc0
{ 
};
struct strc00
{ 
    int getA();
};
struct strc000
{ 
    int* getA()
    {
        return NULL;
    }
};
struct strc1
{
    int a;
    char b;
};
struct strc2
{
    char b;
    int a;
};
struct strc3
{
    char b;
    int a;
    double c;
};
struct strc4
{
    double c;
    char b;
    int a;
};
struct strc5
{
    char b;
    double c;
    int a;
};
struct strc6
{
    int a;
    double c;
    char b;
};
struct strc7
{
    int a;
    double c;
    char b;
    char d;
};
class classA0
{
};
class classA00
{
    int GetA();
    char GetB();
};
class classA000
{
    int GetA()
    {
        return 1;
    }
    char GetB()
    {
        return 'c';
    }
};
class classA1
{
    int a;
    double b;
};
class classA2
{
    char b;
    double c;
    int a;
};
class classA3
{
    char b;
    double c;
    int a;
    char d;
};
int _tmain(int argc, _TCHAR* argv[])
{  
    //基本数据类型
    printf("%d\n",sizeof(char));// 1
    printf("%d\n",sizeof(int));// printf("%d\n",sizeof(2)); 4 
    printf("%d\n",sizeof(double));// printf("%d\n",sizeof(2.12)); 8 
    printf("%d\n",sizeof(string));// 32

    //函数:看其返回值,与内部申请的变量无关,且不调用函数
    printf("%d\n",sizeof(Fun1()));// 4  //没有调用函数
    printf("%d\n",sizeof(Fun2()));// 1
    printf("%d\n",sizeof(Fun3()));// 4

    //指针:占用内存字节数都为4
    printf("%d\n",sizeof(void*));//4
    printf("%d\n",sizeof(int*));// 4

    //数组:其值是(下标*数据类型),当数组为参数时,则沦为了指针
    int a1[4];
    char a2[]="abcd";//char a2[4]="abcd";//数组界限溢出
    char a3[6]="abcd\0";//说明“\0”是一个字符(转义字符)
    char a4[20]="abc";
    printf("%d\n",sizeof(a1));// 4*4=16
    printf("%d\n",sizeof(a2));// 5,字符末尾还存在一个NULL的结束符
    printf("%d\n",sizeof(a3));//6
    printf("%d\n",sizeof(a4));//20,说明给a4分配了20个字节的内存空间,不论是否填充满
    printf("%d\n",sizeof(a4[10]));//1,a4[4]是一个char类型的数据

    //结构体,涉及到字节对齐的问题,而字节对齐的细节与编译器实现有关。
    //结构体的总大小为结构体最宽基本类型成员大小的整数倍
    //结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍
    //自己总结的:结构体的大小=最宽基本类型成员大小+其前后丈量的个数。其成员函数不占用内存
    printf("%d\n",sizeof(strc0));//1,空的结构体占内存为1
    printf("%d\n",sizeof(strc00));//1,在结构体内什么的函数不占内存
    printf("%d\n",sizeof(strc000));//1,在结构体内定义的函数不占内存,不论其返回值是什么。
    printf("%d\n",sizeof(strc1));//8,说明结构体中存在字符对齐的现象
    printf("%d\n",sizeof(strc2));//8
    printf("%d\n",sizeof(strc3));//不是24,而是16
    printf("%d\n",sizeof(strc4));//不是24,而是16
    printf("%d\n",sizeof(strc5));//不是16,而是24
    printf("%d\n",sizeof(strc6));//不是16,而是24
    printf("%d\n",sizeof(strc7));//24
 
    //类:与结构体一样。类的大小=最宽基本类型成员大小+其前后丈量的个数。且成员函数不占用内存
    printf("%d\n",sizeof(classA0));//1
    printf("%d\n",sizeof(classA00));//1,说明申明的函数不占内存
    printf("%d\n",sizeof(classA000));//1,说明定义的函数不占内存
    printf("%d\n",sizeof(classA1));//16,说明类中也存在字符对齐的现象
    printf("%d\n",sizeof(classA2));//24
    printf("%d\n",sizeof(classA3));//24

    system("pause");
    return 0;
}

最后总结:

类/结构体的大小=最宽成员类型+其前后丈量的个数。且成员函数不占用内存,不论其是否有返回值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值