sizeof

简介: sizeof

一、sizeof()函数基础语法
1.定义
sizeof是一个操作符(operator),返回一个对象或类型所占内存的字节数。

2.语法
sizeof有三种语法形式:

1) sizeof (object); //sizeof (对象)

2) sizeof object; //sizeof 对象

3) sizeof (type_name); //sizeof (类型)

对象可以是各种类型的变量,以及表达式(一般sizeof不会对表达式进行计算)。

sizeof (表达式); //值为表达式的最终结果的数据类型的大小

sizeof对对象求内存大小,最终都是转换为对对象的数据类型进行求值。

int i;
sizeof(int); //值为4
sizeof(i); //值为4,等价于sizeof(int)
sizeof i; //值为4
sizeof(3); //值为4,等价于sizeof(int),因为数字3类型为int
sizeof(3 + 3.14); //值为8,等价于sizeof(double),因为该表达式的结果的类型为double
二、sizeof()函数进阶

  1. 基本数据类型——sizeof

基本数据类型指,short、int、long、float、double内置数据类型。

注:它们内存大小与系统相关,不同系统下取值可能不同。

  1. 结构体——sizeof

结构体的sizeof涉及到字节对齐问题。

为什么需要字节对齐?计算机组成原理教导我们这样有助于加快计算机的取数速度,否则就得多花指令周期了。为此,编译器默认会对结构体进行处理(实际上其它地方的数据变量也是如此),让宽度为2的基本数据类型(short等)都位于能被2整除的地址上,让宽度为4的基本数据类型(int等)都位于能被4整除的地址上,依次类推。这样,两个数中间就可能需要加入填充字节,所以整个结构体的sizeof值就增长了。

字节对齐的细节和编译器的实现相关,但一般而言,满足三个准则:

1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除。

2) 结构体的每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要,编译器会在成员之间加上填充字节(internal adding)。

3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要,编译器会在最末一个成员后加上填充字节(trailing padding)。

注意:空结构体(不含数据成员)的sizeof值为1。试想一个“不占空间“的变量如何被取地址、两个不同的“空结构体”变量又如何得以区分呢,于是,“空结构体”变量也得被存储,这样编译器也就只能为其分配一个字节的空间用于占位了。

实例:

include

include <stdlib.h>

using namespace std;

int main()
{

int a, b, c;

struct S1
{
    char a;
    int b;
};
a=sizeof(S1); //值为8,字节对齐,在char之后会填充3个字节。  

struct S2
{
    int b;
    char a;
};
b=sizeof(S2); //值为8,字节对齐,在char之后会填充3个字节。  

struct S3
{
};
c=sizeof(S3); //值为1,空结构体也占内存

cout << a << ' ' << b << ' ' << c;
system("pause");

}
输出结果:

  1. 联合体——sizeof

在内存组织上,结构体是顺序式的;联合体则是重叠式,各成员共享一段内存。所以,整个联合体的sizeof,是每个成员sizeof的最大值。

实例:

include

include <stdlib.h>

using namespace std;

int main()
{

int num;

union u
{
    int a;
    float b;
    double c;
    char d;
};

num =sizeof(u);  //值为8

cout << num << '\n';
system("pause");

}
输出结果:

4.数组——sizeof
数组的sizeof值等于数组所占用的内存字节数。

注意:1)当字符数组表示字符串时,其sizeof值将’/0’计算进去。

        2)当数组为形参时,其sizeof值相当于指针的sizeof值。

实例:

include

include <stdlib.h>

using namespace std;

int main()
{

char a[10];
char n[] = "abc";

cout << "char a[10]  " << sizeof(a) << endl;//数组,值为10  

cout << "char n[] = abc   "  << sizeof(n) << endl;//字符串数组,将'/0'计算进去,值为4

system("pause");

}

void func(char a[3])
{

int c = sizeof(a); //c = 4,因为这里a不在是数组类型,而是指针,相当于char *a。  

}

void funcN(char b[])
{

int cN = sizeof(b); //cN = 4,理由同上。  

}
输出结果:

5.指针——sizeof
指针是用来记录另一个对象的地址,所以指针的内存大小当然就等于计算机内部地址总线的宽度。

在32位计算机中,一个指针变量的返回值必定是4。

注:指针变量的sizeof值与指针所指的对象没有任何关系。

实例:

#include <iostream>
#include <stdlib.h>
using namespace std;
 
int main()
{    char *b = "helloworld";
    char *c[10];
    double *d;
    int **e;
    void(*pf)();
 
    cout << "char *b =helloworld /      "  << sizeof(b) << endl;//指针指向字符串,值为4  
    cout << "char *b                    " << sizeof(*b) << endl; //指针指向字符,值为1  
    cout << "double *d                  " << sizeof(d) << endl;//指针,值为4  
    cout << "double *d                  " << sizeof(*d) << endl;//指针指向浮点数,值为8  
    cout << "int **e                    " << sizeof(e) << endl;//指针指向指针,值为4  
    cout << "char *c[10]                " << sizeof(c) << endl;//指针数组,值为40  
    cout << "void (*pf)();              " << sizeof(pf) << endl;//函数指针,值为4
 
    system("pause");
}

输出结果:

  1. 函数——sizeof

sizeof可对一个函数调用求值,其结果是函数返回值类型的大小,函数并不会被调用。

对函数求值的形式:sizeof(函数名(实参表))

注: 1)不可以对返回值类型为空的函数求值。

        2)不可以对函数名求值。

       3)对有参数的函数,在用sizeof时,须写上实参表。

实例:

#include <iostream>
#include <stdlib.h>
using namespace std;
 
float FuncP(int a, float b)
{
    return a + b;
}
 
int FuncNP()
{
    return 3;
}
 
void Func()
{
}
 
int main()
{
    cout << sizeof(FuncP(3, 0.4)) << endl; //OK,值为4,sizeof(FuncP(3,0.4))相当于sizeof(float)  
    cout << sizeof(FuncNP()) << endl; //OK,值为4,sizeof(FuncNP())相当于sizeof(int)  
                                      /*cout<<sizeof(Func())<<endl; //error,sizeof不能对返回值为空类型的函数求值*/
                                      /*cout<<sizeof(FuncNP)<<endl; //error,sizeof不能对函数名求值*/
    system("pause");
}

输出:

三、测量二维数组行列数
计算二维数组大小实例:

#include <iostream>
#include <stdlib.h>
using namespace std;
 
int main()
{
    int a[2][3] = { 1, 2, 3, 4, 1,2};
 
    int lines, row, column;
 
    lines = sizeof(a) / sizeof(a[0][0]);    // 数组数据总个数
    row = sizeof(a) / sizeof(a[0]);         // 行数
    column = lines / row;                   // 列数
 
    cout << lines << ' ' << row << ' ' << column;
    system("pause");
}
相关文章
|
3月前
|
编译器 C语言
sizeof,sizeof与strlen的区别
sizeof,sizeof与strlen的区别
29 0
sizeof,sizeof与strlen的区别
|
2月前
|
C语言
sizeof
【6月更文挑战第17天】
26 1
|
3月前
|
存储 编译器
strlen()和sizeof()的区别
strlen()和sizeof()的区别
26 0
|
3月前
|
存储 C语言
关于sizeof介绍与分享给大家介绍
关于sizeof介绍与分享给大家介绍
strlen和sizeof详解
strlen和sizeof详解
71 0
|
9月前
sizeof和strlen的对比
sizeof和strlen的对比
37 0
|
11月前
sizeof与strlen区别
sizeof是关键字,参数可以是各种数据(包括函数,类型,对象,数组,指针……)用于计算数据所占字节大小 strlen是函数,参数类型必须是字符型指针(char *),用于计算字符串,从字符串的第一个地址开始遍历,直到遇到‘\0’停止
66 0
|
存储 编译器 C++
C++ sizeof 的介绍
C++ sizeof 的介绍
102 0
sizeof与strlen练习
sizeof与strlen练习
42 0