C++面试之sizeof

本文深入探讨了C++中sizeof运算符的工作原理及应用,通过多个示例解释了数据对齐的概念,并对比了sizeof与其他字符串操作函数的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天去了创新面试。

给我题的MM明显对我极度不爽,我不知道我哪里得罪了她,可能因为我迟到了几分钟?可能因为我头发有点乱?还是因为我长得不帅?

 

在另一个公司试用期,然后跑出来去面试的。- -。毕业,我对国际性大企业异常向往。但现实再次明显的告诉我,我写简历表述自己的功夫可以了,但技术明显还是不过关的。没办法,谁让自己的大学如此荒废,只有现在慢慢再学了。

 

今天了笔试就考了sizeof,慢慢来看看sizeof。

 

先来一个最基础的例子。

 

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
struct{
    short a1;
    short a2;
    short a3;
}A;
struct{
    long a1;
    short a2;
}B;

int main()
{
    char* ss1="0123456789";
    char ss2[]="0123456789";
    char ss3[100]="0123456789";
    int ss4[100];
    char q1[]="abc";
    char q2[]="a/n";
    char* q3="a/n";
    char *str1=(char *)malloc(100);

    void *str2=(void *)malloc(100);

    cout<<sizeof(ss1)<<" ";//ss1为指针,指针为定长4
    cout<<sizeof(ss2)<<" ";//ss2初始没有定义长度,但被后面的值填充,而且最后有一个隐含的"/0",
                           //所以为11
    cout<<sizeof(ss3)<<" ";//ss3已经预分配了100,实际上只能存储99个数,隐含"/0",长度仍为100
    cout<<sizeof(ss4)<<" ";//400
    cout<<sizeof(q1)<<" ";//4
    cout<<sizeof(q2)<<" ";//3
    cout<<sizeof(q3)<<" ";//4
    //A和B是两个结构体.
    //在默认情况下,为了方便对结构体内元素的访问和管理,
    //1.当结构体内的元素的长度都小于处理器的位数的时候,便以结构体里面最长的数据元素为对齐单位,
    //  也就是说,结构体的长度一定是最长的数据元素的整数倍.
    //2.如果结构体内存在长度大于处理器位数的元素,那么就以处理器的位数为对齐单位.
    //  但是结构体内类型相同的连续元素将在连续的空间内,和数组一样.
    cout<<sizeof(A)<<" ";//6
    cout<<sizeof(B)<<" ";//长度会根据长的对齐,8
    cout<<sizeof(str1)<<" ";//4
    cout<<sizeof(str2)<<" ";//无论指针指向数据类型,指针本身长度为4

    system("pause");
    return 0;
}

 

看了上面的内容,就会知道sizeof的主要考点,即数据对齐,那么,何为数据对齐呢?

 

数据对齐,是指数据所在的内存地址必须是该数据长度的整数倍。

 

上题中的结构体B,long为4个字节,short为两个字节,4+2=6,然后按照4和2中的较大者4的倍数,取8。即完成了数据对齐。

 

再来看一个简单的例子,主要说类的sizeof

 

#include <iostream>
using namespace std;

class A{
};

class A2{
    char d,e;
};

struct B{
};

struct C{
    char b,c;
};

struct D{
    int x,y;
};

int main()
{
    //对于一个类而言,即使它是一个空的类,编译器仍然要给它一个空间,所以类A即便什么都没有,
    //它的空间大小仍然是1.
    cout<<sizeof(A)<<endl; //1
    cout<<sizeof(A2)<<endl;//2
    A *p1=new A();
    A p2;
    A *p3;
    cout<<sizeof(p1)<<endl;//4,指针
    cout<<sizeof(p2)<<endl;//1
    cout<<sizeof(p3)<<endl;//4,指针
    cout<<sizeof(B)<<endl; //1
    cout<<sizeof(C)<<endl; //2
    cout<<sizeof(D)<<endl; //8

    system("pause");
    return 0;
}

 

再来看一个简单的例子,有static的计算sizeof

#include <iostream>
using namespace std;

class A1
{
public:
    int a;
    static int b;

    A1();
    ~A1();
};

class A2
{
public:
    int a;
    char c;

    A2();
    ~A2();
};

class A3
{
public:
    float a;
    char c;

    A3();
    ~A3();
};

class A4
{
public:
    float a;
    int b;
    char c;
   
    A4();
    ~A4();
};

class A5
{
public:
    double d;
    float a;
    int b;
    char c;

    A5();
    ~A5();
};

int main()
{
    //静态变量是存放在全局数据区的,而sizeof计算栈中分配的大小,是不会计算在内的
    cout<<sizeof(A1)<<endl;//4
    cout<<sizeof(A2)<<endl;//8,明显4+1=5,然后对齐到8
    cout<<sizeof(A3)<<endl;//8,同上
    cout<<sizeof(A4)<<endl;//12,4+4+1=9,对齐到12
   
    cout<<sizeof(A5)<<endl;//24
    //由此题得知,无论怎样,对齐后的长度都是最大数据长度元素的整数倍,先用8+4+4+1=17,然后扩展为8*3=24

    system("pause");
    return 0;
}

 

ok,static,数据对齐都讨论完了,其实我感觉我对sizeof还是比较熟的吧。。。但今天的笔试题我回想一下是:

 

class A

{

    int i;

    DWORD dWord;

    A* next;

};

 

ms是这样的,sizeof(A)是12,我应该是答对了。

这题考了两点我以上几个例子没有涉及到的,1、DWORD,DWORD的使用需引用#include <windows.h>,它占4个字节,WORD占两个字节,2、类里的指针,同样是4个字节。

 

ok,sizeof暂时就这么多了,然后我们可以看看sizeof与strlen(),size()的异同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值