
sizeof()函数: 计算数据空间中的字节数
1. 与strlen()比较
strlen()计算字符数组中的字符数,并以“ \ 0”结尾,并且不将数组元素计数为'\ 0'.
sizeof计算数据(包括数组,变量,类型,结构等)所占用的内存空间以字节表示.
2. 指针和静态数组的sizeof操作
指针可以视为变量的一种. 所有指针变量的操作结果大小为4.
注意: int * p; sizeof(p)= 4;
但是sizeof(* p)等同于sizeof(int);
对于静态数组,sizeof可以直接计算数组的大小;
例如: int a [10]; char b [] =“ hello”;
sizeof(a)等于4 * 10 = 40;
sizeof(b)等于6;
注意: 当数组用作类型参数时,数组名称用作指针! !
没有乐趣(char p [])
{sizeof(p)等于4}
经典问题:
双*(* a)[3] [6];
cout << sizeof(a)<< endl; // 4a是一个指针
cout << sizeof(* a)<< endl; // 72 * a是具有3 * 6指针元素的数组
cout << sizeof(** a)<< endl; // 24 ** a是数组一维中的6个指针
cout << sizeof(*** a)<< endl; // 4 *** a是一个维度中的第一个指针
cout << sizeof(**** a)<< endl; // 8 **** a是一个双变量
问题分析: a是一个非常奇怪的定义. 他表示一个指向double * [3] [6]类型的数组的指针. 由于它是一个指针,因此sizeof(a)为4.
由于a是实现double * [3] [6]的指针,因此* a表示double * [3] [6]的多维数组类型,因此sizeof(* a)= 3 * 6 * sizeof(double *)=72. 类似地,** a表示类型double * [6]的数组sizeof计算结构体大小,因此sizeof(** a)= 6 * sizeof(double *)=24. *** a表示元素之一是double *,因此sizeof(*** a)=4. 至于**** a,它是double,因此sizeof(**** a)= sizeof(double)= 8.
3. 格式写法

sizeof运算符,您不能在变量或对象中添加括号,但如果是类型,则必须添加括号.
4. 使用sizeof时关于字符串的注意事项
string s =“ hello”;
sizeof(s)等于字符串类的大小,而sizeof(s.c_str())获得字符串的长度.
5. 并集和结构的空间计算
通常,遵循两个原则:
(1)总空间是占用最多空间的成员(类型)所占用字节数的整数倍
(2)数据对齐原理----内存按结构成员的顺序排列. 将其布置到成员变量时,其前面的空间大小必须是成员类型大小的整数倍. 然后填写,依此类推. . . .
注意: 数组是作为单个变量而不是作为一个整体一个一个地放置的. 如果成员中有自定义类和结构,请注意数组问题.
示例: [其他帖子的报价]
由于对齐问题,结构的大小变得更加复杂,请参见以下示例: (默认对齐下)
结构s1
{
字符a;
双b;
int c;
char d;
};
结构s2
{
字符a;
字符b;
int c;
双d;
};

cout << sizeof(s1)<< endl; // 24
cout << sizeof(s2)<< endl; // 16
它也是两种char类型,一种int类型和一种double类型,但是由于对齐问题,它们的大小不同. 元素放置方法可用于计算结构的大小. 让我举一个例子: 首先,CPU确定结构的边界. 根据上一节的结论,s1和s2的边界采用最大的元素类型,即对置8的两倍类型. 然后开始放置每个元素.
对于s1,首先将a放置在8的相对边界上,假设它为0. 这时,下一个空闲地址为1,但是下一个元素d是double类型,需要将其放置在对面8的边界. 关闭地址是8,所以d放置在8,下一个空闲地址变成16,下一个元素c是4,可以满足16,所以c放置在16,下一个空闲地址地址变成20,下一个元素d必须在边界1上,并且它也落在边界上,因此d放置在20处,并且结构在地址21处结束. 由于s1的大小必须是整数倍8sizeof计算结构体大小,保留21-23的空间,而s1的大小变为24.
对于s2,首先将a放在8的相对边界上(假设它为0). 这时,下一个空闲地址为1,而下一个元素的相对边界也为1,因此b放置在1中,并且下一个空闲地址变为2;下一个元素c的下一个边界为4,因此最接近2的地址4放置在c中,下一个空闲地址变为8,而元素d的下一个边界为8,因此d放置在8中. 放置元素,结构结束于15,总占用空间为16,恰好是8的倍数.
这里有一个陷阱. 对于结构中的结构成员,不要认为其对齐方式就是其大小,请参见以下示例:
结构s1
{
字符a [8];
};
结构s2
{
双d;
};
struct s3
{
s1 s;
字符a;
};
struct s4
{
s2 s;
字符a;
};
cout << sizeof(s1)<< endl; // 8

cout << sizeof(s2)<< endl; // 8
cout << sizeof(s3)<< endl; // 9
cout << sizeof(s4)<< endl; // 16;
尽管s1和s2的大小为8,但s1的对齐方式为1,而s2的对齐方式为8(两倍),因此s3和s4之间存在这种差异.
因此,当您自己定义结构时,如果空间狭窄,则最好考虑对齐因素以在结构中排列元素.
补充: 不要让双倍干扰您的位字段
在结构和类中,可以使用bit字段指定成员可以占用的空间,因此bit字段可以在一定程度上节省结构所占用的空间. 但是请考虑以下代码:
结构s1
{
int i: 8;
int j: 4;
双b;
int a: 3;
};
结构s2
{
int i;
int j;
双b;
int a;
};
struct s3
{
int i;
int j;

int a;
双b;
};
struct s4
{
int i: 8;
int j: 4;
int a: 3;
双b;
};
cout << sizeof(s1)<< endl; // 24
cout << sizeof(s2)<< endl; // 24
cout << sizeof(s3)<< endl; // 24
cout << sizeof(s4)<< endl; // 16
如您所见,double的存在会干扰位字段(请参见sizeof算法的上一部分),因此,在使用位字段时,最好将float类型和double类型放在开头或程序结束.
sizeof int: 4
sizeof short: 2
sizeof long: 4
floatof浮点数: 4
sizeof double: 8
大小字符: 1
sizeof p: 4
word的大小: 2
DWORD的大小: 4
原始文本来自:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-206016-1.html
包括广东
谁都可以无害通过