携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第27天,点击查看活动详情
讲讲sizeof(上)
sizeof在C++里面其实是一个运算符,这个在前面的文章中也已经讲过了。它的作用就是根据C++静态强类型语言的特征,来计算出相应内容所占的内存大小。下面我们对照着代码来讲解一下它的功能。
#include <stdio.h>
#include <iostream>
using namespace std;
void f2(int a[])
{
printf("sizeof(a)=%d\n", sizeof(a));
}
void f5(int (*a)[6])
{
printf("sizeof(a)=%d\n", sizeof(*a));
}
void testSizeof()
{
int a[6];
f2(a);
f5(&a);
}
int main(){
testSizeof();
return 0;
}
输出为:
sizeof(a)=8
sizeof(a)=24
对于f2这个函数,就非常有迷惑性,首先它接收的入参是一个int数组,然后打印的时候,正常思维可能会觉得它会打印数组的长度,殊不知这里有以下这么几点误区:首先,C++传数组,其实就是传数组的首地址,其实就是指针,那么sizeof在作用于指针时,计算的是指针的大小,这里因为是x64系统,所以指针就占64bit,换算成字节就是8byte。
对于f5这个函数,则让人更加摸不着头脑。首先要解释一下它的入参,int (*a)[6]其实代表的是一个指向固定大小为6的数组的指针,与其写法类似的还有函数指针(int (*p)(int a, int b)。这时外部的传参也确实就是一样的含义。对于指针使用*操作符,就是取指针指向的内容,在这里就是固定大小的数组。那么当sizeof作用于一个固定大小的数组(注意,不是指针!!!)时,它的作用就是求出这块连续内存地址空间的大小,即,其中4是一个int类型变量占的内存大小。sizeof在求结构体的大小的时候,也有很多的坑,主要还是涉及到内存对齐相关的问题。这也就是C++的魔幻之处,在普通代码的背后,隐藏着很多你不知道的操作……