《程序员面试宝典》C/C++关键字-sizeof

4.3关键字sizeof
在32位机器中,zieof对应char类型1个字节,short(short int)类型两个字节,int类型四个字节,long四个字节,float四个字节,char *四个字节,double8个字节。
4.3.1sizeof和strlen的区别比较
(1)strlen(“\0”)=0, strlen(“\0\0”)=0
sizeof(“\0”)=2, Sizeof(“\0\0”)=3
strlen是一个函数,执行的是计数器功能,从字符串开头扫描,碰到第一个’\0’结束,记录前面字符个数。
sizeof是c语言关键字,以字节的形式给出了其操作数的大小,不以’\0’为结束符,并且会将其以char型(1个字节)记录。
下面列举具体区别:
1)sizeof是关键字,strlen是函数。
2)sizeof可以用类型甚至是函数做参数,例如,int g(),sizeof(g())的值等于sizeof(int)=4(在32位机下),strlen只能是一’\0’结尾的char*做参数。
3)当数组名做sizeof的参数不退化,传递给strlen就退化成为指针。例如char a[10]=”12345”,sizeof(a)=1*10,strlen(a)=0;原因还是strlen遇到’\0’即结束计数。
例1

#include<iostream>
using namespace std;
void main()
{
    char str[10] = "12345";
    cout << sizeof(str) << endl;
    cout << strlen(str) << endl;
}

结果分别是:10,5.
例2

#include<iostream>
using namespace std;
void main()
{
    char *str = "12345";
    cout << sizeof(str) << endl;//指针的大小为4
    cout << sizeof(*str) << endl;//指针指向的字符大小为1
    cout << strlen(str) << endl;//字符指针内容个数是5
}

结果分别是:4,1,5。

4.3.2sizeof取结构体大小的字节对齐问题
字节对齐也称为字节填充,是为了在可接受的空间浪费的前提下,尽可能提高对相同运算过程的最少(快)处理。一般32位计算机以四字节存储,64位已8字节存储。下面是改变默认的对界条件:
(1)使用伪指令#pragma pack(n),将按照n个字节对齐
(2)使用伪指令#pragma pack(),取消字节对齐方式
(3)_attribute(sligened(n)),所有的结构成员一n字节对齐,如果有成员长度大于n,按最大成员长度对齐。_attribute(sligened()),按世界占用字节数进行对齐。
例1

#include<iostream>
using namespace std;

struct test
{
    char x1;
    short x2;
    float x3;
    char x4;
};

void main()
{
    cout << sizeof(test) << endl;//结果是12字节
}

默认情况下四字节对齐,x1占一个字节,x2占两个字节,x3占4个字节,x4占一个字节,按下图方式对齐。
这里写图片描述

猜你喜欢

转载自blog.csdn.net/wangshuailpp/article/details/79914021